是否有一个正则表达式可以检查字符串是否仅包含大写和小写字母、数字和下划线?
是否有一个正则表达式可以检查字符串是否仅包含大写和小写字母、数字和下划线?
要匹配仅包含这些字符(或空字符串)的字符串,请尝试
"^[a-zA-Z0-9_]*$"
这适用于.NET正则表达式,可能也适用于许多其他语言。
分解一下:
^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string
如果你不想允许空字符串,可以用+
代替*
。
正如其他人指出的那样,一些正则表达式语言有[a-zA-Z0-9_]
的简写形式。在.NET正则表达式语言中,你可以打开ECMAScript行为并使用\w
作为快捷方式(得到^\w*$
或^\w+$
)。请注意,在其他语言中,默认情况下在.NET中,\w
稍微宽泛,也会匹配其他类型的Unicode字符(感谢Jan指出这一点)。因此,如果你真的打算只匹配仅限于这些字符,使用显式的(较长)形式可能是最好的。
[\p{upper}\p{lower}\p{gc=Number}_]
就足够让你正确执行此操作。 - tchrist这里有很多啰嗦的内容,我深感反感,因此我的结论是:
/^\w+$/
\w
等同于[A-Za-z0-9_]
,这基本上是您想要的(除非我们引入Unicode)。
使用+
量词,可以匹配一个或多个字符。如果您还想接受空字符串,请改用*
。
\w
通常不仅限于ASCII字符。 - tchrist[a-z]
及其变体。\w
也会捕获非拉丁字符,例如 šēēā
或 кукареку
。 - Alex from Jitbit\w
等同于[a-zA-Z0-9_]
,这意味着两者都受到ASCII字符集的限制。 - Armen Michaeli/\p{L}/u
(请注意Unicode标志)。演示:"é".match(/\w/)
❌,"é".match(/\p{L}/u)
✅ - V. Rubinetti您想检查每个字符是否符合要求,因此我们使用:
[A-Za-z0-9_]
你甚至可以使用简写版本:
\w
^
如果要表示字符串必须以该字符开头,则使用
$
\w+ or \w*
^\w*$
虽然比\w
更冗长,但我个人很欣赏完整的 POSIX 字符类名称的可读性(http://www.zytrax.com/tech/web/regex.htm#special),所以我会说:
^[[:alnum:]_]+$
然而,尽管上述链接的文档说明\w
会“匹配在0-9、A-Z和a-z范围内的任何字符(相当于POSIX[:alnum:])”,但我发现这并不正确,至少在使用grep -P
时是这样。如果您使用[:alnum:]
,则需要明确包含下划线,但如果您使用\w
,则不需要。以下代码最简洁:^\w+$
除了易读性外,使用 POSIX 字符类(http://www.regular-expressions.info/posixbrackets.html)意味着您的正则表达式可以在非 ASCII 字符串上工作,而基于范围的正则表达式不会这样做,因为它们依赖于 ASCII 字符的底层排序,这可能与其他字符集不同,并因此排除一些您可能想要捕获的非 ASCII 字符(如 œ 这样的字母)。
嗯...问题是:它是否需要至少有一个字符?还是可以是空字符串?
^[A-Za-z0-9_]+$
至少会做一个大写或小写字母、数字或下划线匹配。如果长度可以为零,则将+替换为*:
^[A-Za-z0-9_]*$
^\w+$
或者
^\w*$
^([A-Za-z]|[0-9]|_)+$
如果您想表达得更明确,可以使用以下方式:
^\w+$
如果您更喜欢简洁的(Perl语法)。
^\w+$
来匹配带有重音的字母。 - fellyp.santos$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'
^[A-Za-z_][A-Za-z\d_]*$
使用先行断言来实现「至少一个」内容。相信我,这样做更容易。
下面是一个示例,要求1-10个字符,包含至少一个数字和一个字母:
^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$
注意: 我本可以使用 \w,但那样会牵涉到 ECMA/Unicode 的考虑,扩大了 \w “单词字符”的覆盖范围。
这对我有用。我在 O'Reilly 的 "Mastering Regular Expressions" 中发现了这个:
/^\w+$/
说明:
自行验证:
const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;
if ((m = regex.exec(str)) !== null) {
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
尝试使用我为字符串创建的多语言扩展。
IsAlphaNumeric - 字符串必须至少包含一个 alpha(在 charSet 中指定的 Unicode 范围内的字母)和一个数字(在 numSet 中指定)。此外,该字符串应仅由 alpha 和数字组成。
IsAlpha - 字符串应该至少包含一个 alpha(在指定的语言 charSet 中),并且仅由 alpha 组成。
IsNumeric - 字符串应该至少包含一个数字(在指定的语言 numSet 中),并且仅由数字组成。
所需语言的 charSet/numSet 范围可以指定。Unicode 范围可在 Unicode Chart 上找到。
API:
public static bool IsAlphaNumeric(this string stringToTest)
{
// English
const string charSet = "a-zA-Z";
const string numSet = @"0-9";
// Greek
//const string charSet = @"\u0388-\u03EF";
//const string numSet = @"0-9";
// Bengali
//const string charSet = @"\u0985-\u09E3";
//const string numSet = @"\u09E6-\u09EF";
// Hindi
//const string charSet = @"\u0905-\u0963";
//const string numSet = @"\u0966-\u096F";
return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
}
public static bool IsNumeric(this string stringToTest)
{
//English
const string numSet = @"0-9";
//Hindi
//const string numSet = @"\u0966-\u096F";
return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
}
public static bool IsAlpha(this string stringToTest)
{
//English
const string charSet = "a-zA-Z";
return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
}
用法:
// English
string test = "AASD121asf";
// Greek
//string test = "Ϡϛβ123";
// Bengali
//string test = "শর৩৮";
// Hindi
//string test = @"क़लम३७ख़";
bool isAlphaNum = test.IsAlphaNumeric();