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


585

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

regex 

9
遗憾的是,不同的正则表达式引擎使用不同的方式来匹配字母数字。像这样的问题(比较模糊,没有指出语言/正则表达式的味道)需要在每种味道上停留很长时间,或者至少是非常有条理的答案。
WiktorStribiżew16年

Answers:


938

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

"^[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指出了这一点)。因此,如果您真的只想匹配那些字符,则最好使用显式(较长)形式。


8
如果您去过德国,或者几乎看不到任何德语文本,您都会明白我的意思。
Windows程序员

30
\ w和[A-Za-z0-9_]在大多数正则表达式中不相同。\ W包括从其他脚本等用变音符号的字母,字母
扬Goyvaerts

4
最初的问题确实说“大写和小写字母”,因此,非拉丁文字的“字母”似乎应该匹配。
Trejkaz 2011年

3
[\p{upper}\p{lower}\p{gc=Number}_]假设没有任何组合字符,这就是您需要做的所有事情。
tchrist 2012年

1
看起来preg_match要求您的模式用定界符括起来,定界符通常是斜杠。因此,您将需要“ / ^ [a-zA-Z0-9 _] * $ /”。有关更多信息,请参见此问题:stackoverflow.com/questions/6445133/…。另请参见此
查理(Charlie)

346

这里有很多详细信息,我对此表示强烈反对,因此,我的最终答案将是:

/^\w+$/

\w等价于[A-Za-z0-9_],这几乎就是您想要的。(除非我们将unicode引入混合)

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


67
\w通常不仅仅限于ASCII。
tchrist 2012年

26
英语不是世界上唯一的语言,因此这应该是公认的答案,而不是[a-z]及其变体。\w也将捕获非拉丁字符。喜欢šēēā还是кукареку
Alex

1
在O'Reilly“掌握正则表达式”的第318页上进行了验证
guidotex

36

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

[A-Za-z0-9_]

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

\w

这是等效的(在某些正则表达式中,因此请确保在使用前检查一下)。然后使用以下命令指示整个字符串必须匹配:

^

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

$

为了指示字符串必须以该字符结尾。然后使用

\w+ or \w*

表示“ 1或更大”或“ 0或更大”。放在一起,我们有:

^\w*$

10
\ w和[A-Za-z0-9_]在大多数正则表达式中不相同。\ W包括从其他脚本等用变音符号的字母,字母
扬Goyvaerts

31

问题:它是否需要至少一个字符或没有字符?可以是空字符串吗?

^[A-Za-z0-9_]+$

将至少使用一个大写或小写字母数字或下划线。如果长度可以为零,则用+代替*

^[A-Za-z0-9_]*$

编辑:

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

^\w+$

要么

^\w*$

好了,现在您提到它,我也错过了很多其他的法语字符……
BenAlabaster

1
\ w与[\ w]相同,打字操作更少
Jan Goyvaerts

是的,您仍然需要+或*以及^和$-\ w只是检查它是否包含文字字符,而不是它包含文字字符...
BenAlabaster

奇怪的是,这仍然允许$符号。
Induster

@Induster,这是因为BenAlabaster刚刚指出的内容
Sebas

27

尽管它比更为冗长\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字符(如–字母)。


22

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

这是您要执行的操作:

在php下测试:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

或拿这个

^[A-Za-z_][A-Za-z\d_]*$

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


17

怎么样:

^([A-Za-z]|[0-9]|_)+$

...如果您想露骨,或:

^\w+$

...如果您希望简洁(Perl语法)。


12

用先行者做“至少一个”的事情。相信我,这要容易得多。

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

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

注意:可以使用\ w,但是ECMA / Unicode注意事项开始起作用,从而增加了\ w“单词字符”的字符覆盖率。


如果要在列表中添加_和-,该怎么办?
拉西2015年

10

尝试这些我为字符串制作的多语言扩展。

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

IsAlpha-字符串应至少包含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;
    }

用法:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();

@Shah:我添加了唯一的字母(也只有数字)。
珊塔努

8

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

^[a-zA-Z0-9_]+$

例如,在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";
}

您的代码中的模式是正确的,但是上面的模式仅检查单个实例。
BenAlabaster

这是有意的,代码示例旨在澄清实际检查字符串时的用法。同样,为什么代码也具有行标记的开始和结束,而正则表达式示例中没有。
杰伊

1
@Windows程序员-en.wikipedia.org/wiki/ 字母数字 - 拉丁字母,而不是包括变音符号等在内的“拉丁字符集”。纯粹是语义问题,但我个人使用术语字母数字作为AZ和0-9。
杰伊

2
ñ是西班牙语(包括拉丁美洲)中的字母。
Windows程序员

2
“我希望有一个正则表达式可以检查字符串是否仅包含大写和小写字母,数字和下划线”,但它并不限于拉丁字母。“以下正则表达式匹配字母数字字符和下划线”并不将其限制为拉丁字母。“ ^ [a-zA-Z0-9 _] + $”失败。
Windows程序员

6

在大多数情况下,这应该可行。

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

我的意思是

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


说明

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

2
原始问题没有要求必须出示这封信。
德米特里·库兹米诺夫

你在说哪一封信?我的正则表达式包含问题中所问的那个。字母,数字,下划线
Chinmaya Pati

1234是作者要求的语言中的单词。您的语言更具限制性。
德米特里·库兹米诺夫,

4

对我来说,存在一个问题,我想区分字母,数字和字母数字,因此为了确保字母数字字符串包含至少一个字母和至少一个数字,我使用了:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

正是我想要的...谢谢
Aniket羽衣甘蓝18/12/24

3

这是您想要用量词指定至少1个字符且不超过255个字符的正则表达式

[^a-zA-Z0-9 _]{1,255}


2

我相信您在比赛中不会使用拉丁和Unicode字符。例如,如果您需要使用“ã”或“ü”字符,则无法使用“ \ w”。

您也可以使用以下方法:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

希望能帮助到你!


1

要检查整个字符串而不允许使用空字符串,请尝试

^[A-Za-z0-9_]+$

1

^\w*$ 适用于以下组合

1
123
1av
pRo
av1

空行呢。它也是字母数字字符串吗?
v010dya


0

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

/^\w+$/

说明:

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

验证自己:

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}`);
    });
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.