字母数字和下划线的正则表达式

547 regex

我想有一个正则表达式,检查字符串是否只包含大写和小写字母,数字和下划线.

Cha*_*lie 879

要匹配包含这些字符(或空字符串)的字符串,请尝试

"^[a-zA-Z0-9_]*$"
Run Code Online (Sandbox Code Playgroud)

这适用于.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
Run Code Online (Sandbox Code Playgroud)

如果您不想允许空字符串,请使用+而不是*.

编辑正如其他人所指出的,一些正则表达式语言有一个简写形式[a-zA-Z0-9_].在.NET正则表达式语言中,您可以打开ECMAScript行为并\w用作速记(屈服^\w*$^\w+$).请注意,在其他语言中,默认情况下在.NET中,\w稍微宽泛一些,并且还会匹配其他类型的unicode字符(感谢Jan指出这一点).因此,如果您真的打算匹配这些字符,那么使用显式(更长)形式可能是最好的.

  • \ w和[A-Za-z0-9_]在大多数正则表达式中都不相同.\ w包括带有变音符号的字母,来自其他脚本的字母等. (29认同)
  • 如果你去过德国,或者你曾经看过任何德语文本,你会看到我在说什么. (7认同)
  • 最初的问题确实说"大写和小写字母",所以看起来非拉丁文字的"字母"应该匹配. (4认同)
  • `[\ p {upper}\p {lower}\p {gc = Number} _]`你需要这么做,假设没有组合字符. (3认同)
  • 所有的赞成票是怎么回事。这是不正确的。它只适用于英语。如果您要进行编辑,请编辑它。不要添加“编辑:”,只需使其正确即可。 (3认同)

kch*_*kch 327

这里有很多冗长,我深深反对,所以,我的结论是:

/^\w+$/
Run Code Online (Sandbox Code Playgroud)

\w相当于[A-Za-z0-9_],这几乎是你想要的.(除非我们将unicode引入混音)

使用+量词,您将匹配一个或多个字符.如果您也想接受空字符串,请*改用.

  • `\ w`通常不仅限于ASCII. (63认同)
  • 英语不是世界上唯一的语言,所以这应该是公认的答案,而不是"[az]"及其变体.`\ w`也会捕获非拉丁字符.喜欢`šēēā`或`кукареку` (22认同)
  • 在 O'Reilly“掌握正则表达式”第 318 页上验证 (3认同)
  • `\w` 相当于 ECMAScript 中的 `[a-zA-Z0-9_]` (即在现代 Web 浏览器中运行的内容),这意味着两者都仅限于 ASCII。 (2认同)

Ant*_*ton 36

您想检查每个字符是否符合您的要求,这就是我们使用的原因:

[A-Za-z0-9_]
Run Code Online (Sandbox Code Playgroud)

你甚至可以使用速记版本:

\w
Run Code Online (Sandbox Code Playgroud)

这是等效的(在某些正则表达式中,所以请确保在使用之前进行检查).然后,为了表明整个字符串必须匹配,您使用:

^
Run Code Online (Sandbox Code Playgroud)

要指示字符串必须以该字符开头,请使用

$
Run Code Online (Sandbox Code Playgroud)

指示字符串必须以该字符结尾.然后用

\w+ or \w*
Run Code Online (Sandbox Code Playgroud)

表示"1或更多",或"0或更多".总而言之,我们有:

^\w*$
Run Code Online (Sandbox Code Playgroud)

  • \ w和[A-Za-z0-9_]在大多数正则表达式中都不相同.\ w包括带有变音符号的字母,来自其他脚本的字母等. (10认同)

Ben*_*ter 28

嗯......问题:是否需要至少有一个角色?它可以是一个空字符串吗?

^[A-Za-z0-9_]+$
Run Code Online (Sandbox Code Playgroud)

将做至少一个大写或小写字母数字或下划线.如果它可以是零长度,那么只需用+代替*

^[A-Za-z0-9_]*$
Run Code Online (Sandbox Code Playgroud)

编辑:

如果需要包含变音符号(例如cedilla - ç),那么你需要使用与上面相同的单词character,但包括变音字符:

^\w+$
Run Code Online (Sandbox Code Playgroud)

要么

^\w*$
Run Code Online (Sandbox Code Playgroud)


Day*_*ury 26

虽然它比起来更冗长\w,但我个人非常欣赏完整POSIX字符类名称的可读性(http://www.zytrax.com/tech/web/regex.htm#special),所以我会说:

^[[:alnum:]_]+$
Run Code Online (Sandbox Code Playgroud)

但是,虽然上述链接的文档说" \w将匹配范围0 - 9,A - Z和a - z(相当于POSIX [:alnum:])"中的任何字符,但我没有发现这是真的.grep -P反正不是.如果使用[:alnum:],则需要明确包含下划线,但如果使用则不需要\w.简短而甜蜜的你无法击败以下内容:

^\w+$
Run Code Online (Sandbox Code Playgroud)

除了可读性之外,使用POSIX字符类(http://www.regular-expressions.info/posixbrackets.html)意味着你的正则表达式可以处理非ASCII字符串,基于范围的正则表达式不会因为它们依赖ASCII字符的基础排序可能与其他字符集不同,因此会排除您可能想要捕获的一些非ASCII字符(字母,如œ).


Dan*_*eal 21

在计算机科学中,字母数字值通常表示第一个字符不是数字,而是字母或下划线.此后,字符可以是0-9,A-Z,a-z,或下划线(_).

以下是您将如何做到这一点:

在php下测试:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'
Run Code Online (Sandbox Code Playgroud)

或者拿这个

^[A-Za-z_][A-Za-z\d_]*$
Run Code Online (Sandbox Code Playgroud)

并将其放在您的开发语言中.


Dre*_*all 16

怎么样:

^([A-Za-z]|[0-9]|_)+$
Run Code Online (Sandbox Code Playgroud)

...如果你想要明确,或者:

^\w+$
Run Code Online (Sandbox Code Playgroud)

...如果您更喜欢简洁(Perl语法).


小智 12

使用前瞻来做"至少一个"的东西.相信我,这更容易.

这是一个需要1-10个字符的示例,包含至少一个数字和一个字母:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$
Run Code Online (Sandbox Code Playgroud)

注意:本来可以使用\ w但是ECMA/Unicode考虑因素会起作用,增加\ w"单词字符"的字符覆盖率.


Sha*_*anu 10

试试我为字符串做的这些多语言扩展.

IsAlphaNumeric - 字符串必须包含至少1个alpha(Unicode范围内的字母,在charSet中指定)和至少1个数字(在numSet中指定).此外,字符串应仅包含字母和数字.

IsAlpha - String应包含至少1个alpha(在指定的语言charSet中)并且仅包含alpha.

IsNumeric - 字符串应包含至少1个数字(使用指定的语言numSet)并且仅包含数字.

可以指定所需语言的charSet/numSet范围.Unicode范围可在以下链接中找到:

http://www.ssec.wisc.edu/~tomw/java/unicode.html

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;
    }
Run Code Online (Sandbox Code Playgroud)

用法:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "???123";

        //Bengali
        //string test = "????";

        //Hindi
        //string test = @"??????";

        bool isAlphaNum = test.IsAlphaNumeric();
Run Code Online (Sandbox Code Playgroud)


MiK*_*r13 10

这对我有用,在 O'Reilly 的“掌握正则表达式”中找到了这个:

/^\w+$/
Run Code Online (Sandbox Code Playgroud)

解释:

  • ^ 断言字符串开头的位置
    • \w+ 匹配任何单词字符(等于 [a-zA-Z0-9_])
    • “+”量词——匹配一次和无限次,尽可能多次,根据需要回馈(贪婪)
  • $ 断言字符串末尾的位置

验证自己:


Jay*_*Jay 8

以下正则表达式匹配字母数字字符和下划线:

^[a-zA-Z0-9_]+$
Run Code Online (Sandbox Code Playgroud)

例如,在Perl中:

#!/usr/bin/perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}
Run Code Online (Sandbox Code Playgroud)

  • 什么时候 - 不再是拉丁语? (2认同)
  • @Windows程序员 - http://en.wikipedia.org/wiki/Alphanumeric - 拉丁*字母*,而不是“拉丁字符集”,其中包括变音符号等。纯粹是语义问题,但我个人倾向于常见用法术语字母数字如 AZ 和 0-9。 (2认同)
  • ñ是西班牙语字母表,包括拉丁美洲. (2认同)
  • "我希望有一个正则表达式来检查字符串是否只包含大写和小写字母,数字和下划线"并不限制它为拉丁字母."以下正则表达式匹配字母数字字符和下划线"并不限制它为拉丁字母."^ [a-zA-Z0-9 _] + $"失败. (2认同)

Chi*_*ati 7

这应该适用于大多数情况。

/^[\d]*[a-z_][a-z\d_]*$/gi

我的意思是,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False
Run Code Online (Sandbox Code Playgroud)


解释

  1. ^ ... $ - 匹配开始和结束的模式
  2. [\d]* - 匹配零个或多个数字
  3. [a-z_] - 匹配字母或下划线
  4. [a-z\d_]* - 匹配字母或数字或下划线
  5. /gi - 跨字符串全局匹配且不区分大小写

  • 最初的问题没有要求必须提供这封信。 (2认同)

Agu*_*tin 5

对于那些寻找 unicode 字母数字匹配的人,您可能需要执行以下操作:

^[\p{L} \p{Nd}_]+$
Run Code Online (Sandbox Code Playgroud)

进一步阅读请参阅Unicode 正则表达式(Unicode Consortium)和Unicode 正则表达式(Regular-Expressions.info)。