ChatGPT解决这个技术问题 Extra ChatGPT

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

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

遗憾的是,不同的正则表达式引擎匹配字母数字的方式不同。像这样的问题(相当模糊,没有指明语言/正则表达式风格)需要一个非常长的,或者至少是一个非常有条理的答案,围绕每种风格。

q
questionto42standswithUkraine

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

"^[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 指出这一点)。因此,如果您真的打算匹配那些字符,使用显式(更长)形式可能是最好的。


如果你去过德国,或者如果你看过任何德语文本,你就会明白我在说什么。
\w 和 [A-Za-z0-9_] 在大多数正则表达式风格中是不等价的。 \w 包括带有变音符号的字母、来自其他脚本的字母等。
最初的问题确实说“大写和小写字母”,所以看起来非拉丁文字的“字母”应该匹配。
[\p{upper}\p{lower}\p{gc=Number}_] 是您正确执行此操作所需的全部内容,假设没有组合字符。
所有的赞成票是怎么回事。这是不正确的。它仅适用于英语。如果您要进行编辑,请编辑它。不要添加“编辑:”,只需使其正确即可。
k
kch

这里有很多冗长,我强烈反对,所以,我的结论性答案是:

/^\w+$/

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

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


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

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

[A-Za-z0-9_]

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

\w

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

^

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

$

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

\w+ or \w*

表示“1 或更多”,或“0 或更多”。综上所述,我们有:

^\w*$

\w 和 [A-Za-z0-9_] 在大多数正则表达式风格中是不等价的。 \w 包括带有变音符号的字母、来自其他脚本的字母等。
它们与 ECMAScript 等价。
D
Day Davis Waterbury

虽然它比 \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 字符(如 – 之类的字母)。


B
BenAlabaster

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

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

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

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

编辑:

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

^\w+$

或者

^\w*$

好吧,既然你提到了它,我也错过了一大堆其他法语角色......
\w 与 [\w] 相同,输入更少
是的,你仍然需要 + 或 * 以及 ^ 和 $ - \w 只是检查它是否包含单词字符,而不是它只包含单词字符......
奇怪的是,这仍然允许 $ 符号。
@Induster,这是因为 BenAlabaster 刚刚指出的
L
Lupus Ossorum

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

以下是您将如何执行此操作:

在php下测试:

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

或者拿这个

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

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


D
Drew Hall

怎么样:

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

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

^\w+$

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


P
Peter O.

使用前瞻来做“至少一个”的事情。相信我,这要容易得多。

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

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

注意:本可以使用 \w 但随后 ECMA/Unicode 考虑开始发挥作用,增加了 \w “单词字符”的字符覆盖率。


如果我们想将 _ 和 - 添加到列表中,我们会怎么做?
M
MiKr13

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

/^\w+$/

解释:

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

\w+ 匹配任何单词字符(等于 [a-zA-Z0-9_])

“+”量词——匹配一次到无限次,尽可能多次,根据需要回馈(贪婪)

$ 断言字符串末尾的位置

验证自己:

常量正则表达式 = /^\w+$/;常量 str = `nut_cracker_12`;让 m; if ((m = regex.exec(str)) !== null) { // 可以通过 `m` 变量访问结果。 m.forEach((match, groupIndex) => { console.log(`找到匹配,组 ${groupIndex}: ${match}`); }); }


S
Shantanu

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

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

接口:

    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:我添加了唯一的字母(也只有数字)。
J
Jay

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

^[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";
}

您的代码中的模式是正确的,但上面的模式只检查一个实例。
这是故意的,代码示例旨在作为实际检查字符串的澄清用法。还有为什么代码也有行首和行尾标记,这不在正则表达式示例中。
@Windows 程序员 - en.wikipedia.org/wiki/Alphanumeric - 拉丁 alphabet,而不是“拉丁字符集”,其中包括变音符号等。纯粹是语义问题,但我个人认为字母数字一词的常见用法是 AZ和0-9。
ñ 是西班牙语中的一个字母,包括拉丁美洲。
“我想要一个正则表达式来检查字符串是否只包含大小写字母、数字和下划线”并没有将其限制为拉丁字母。 “以下正则表达式匹配字母数字字符和下划线”并不将其限制为拉丁字母。 "^[a-zA-Z0-9_]+$" 失败。
C
Chinmaya Pati

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

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

我的意思是,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False

解释

... $ - 匹配以 [\d] 开头和结尾的模式* - 匹配零个或多个数字 [a-z_] - 匹配字母或下划线 [az\d_]* - 匹配字母或数字或下划线 / gi - 跨字符串全局匹配且不区分大小写


最初的问题没有要求信件必须存在。
你说的是哪封信?我的正则表达式包含问题中提出的那个。字母、数字、下划线
1234 是作者要求的语言中的单词。你的语言更严格。
G
Grijesh Chauhan

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

^[\p{L} \p{Nd}_]+$

http://unicode.org/reports/tr18/http://www.regular-expressions.info/unicode.html 进一步阅读


如果你只想拉丁语做 p{Latin} 而不是 p{L}
A
Alan Moore

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

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

正是我想要的...谢谢
b
barbsan

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

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

M
Marcio Martins

我相信您在比赛中没有使用拉丁字符和 Unicode 字符。例如,如果您需要使用 "ã" 或 "ü" 字符,则使用 "\w" 将不起作用。

或者,您可以使用这种方法:

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

希望能帮助到你!


b
barbsan

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

1
123
1av
pRo
av1

空行怎么办。它也是一个字母数字字符串吗?
A
AL-zami

对于 Java,只允许不区分大小写的字母数字和下划线。

^ 匹配以任意字符开头的字符串

[a-zA-Z0-9_]+ 匹配字母数字字符和下划线。

$ 匹配以零个或多个字符结尾的字符串。

公共类 RegExTest { public static void main(String[] args) { System.out.println("_C#".matches("^[a-zA-Z0-9_]+$")); } }


D
David Norman

要检查整个字符串并且不允许空字符串,请尝试

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

P
Paul Rooney

这对我有用,你可以试试

[\\p{Alnum}_]

我试试这个,我得到了未知的属性 Alnum,这是在哪里定义的?
d
derloopkat

所需格式 允许以下 3 个:

0142171547295 014-2171547295 123abc

不允许其他格式:

validatePnrAndTicketNumber(){
    let alphaNumericRegex=/^[a-zA-Z0-9]*$/;
    let numericRegex=/^[0-9]*$/;
    let numericdashRegex=/^(([1-9]{3})\-?([0-9]{10}))$/;
   this.currBookingRefValue = this.requestForm.controls["bookingReference"].value;
   if(this.currBookingRefValue.length == 14 && this.currBookingRefValue.match(numericdashRegex)){
     this.requestForm.controls["bookingReference"].setErrors({'pattern': false});
   }else if(this.currBookingRefValue.length ==6 && this.currBookingRefValue.match(alphaNumericRegex)){
    this.requestForm.controls["bookingReference"].setErrors({'pattern': false});
   }else if(this.currBookingRefValue.length ==13 && this.currBookingRefValue.match(numericRegex) ){
    this.requestForm.controls["bookingReference"].setErrors({'pattern': false});
   }else{
    this.requestForm.controls["bookingReference"].setErrors({'pattern': true});
   }
}
<input name="booking_reference" type="text" [class.input-not-empty]="bookingRef.value"
    class="glyph-input form-control floating-label-input" id="bookings_bookingReference"
    value="" maxlength="14" aria-required="true" role="textbox" #bookingRef
    formControlName="bookingReference" (focus)="resetMessageField()" (blur)="validatePnrAndTicketNumber()"/>