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

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

1539209 次浏览

使用

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

…如果你想明确,或者:

^\w+$

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

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

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

将至少执行一个大写或小写字母数字或下划线。如果长度可以为零,则只需将+替换为*

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

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

^\w+$

^\w*$

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

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

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

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

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

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

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

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

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

[A-Za-z0-9_]

您甚至可以使用简写版本:

\w

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

^

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

$

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

\w+ or \w*

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

^\w*$

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

/^\w+$/

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

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

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

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

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

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

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

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

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

IsAlphaNumera-字符串必须至少包含一个alpha(Unicode范围内的字母,以charSet指定)和至少一个数字(以numSet指定)。此外,字符串应仅由alpha和数字组成。

IsAlpha-字符串应至少包含一个alpha(在指定的语言charSet中)并且仅由alpha组成。

IsNumric-字符串应至少包含一个数字(在指定的语言numSet中),并且仅由数字组成。

可以指定所需语言的charSet/numSet范围。Unicode范围在Unicode图表上可用。

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();

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

以下是你如何做到这一点:

在PHP下测试:

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

或采取

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

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

对于那些寻找Unicode字母数字匹配的人,您可能想要做以下事情:

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

进一步的阅读是在Unicode正则表达式(Unicode联盟)和Unicode正则表达式(Regular-Expressions.info)。

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

这对我很有效。你可以试试:

[\\p{Alnum}_]

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

1
123
1av
pRo
av1

我相信你在比赛中没有使用拉丁和Unicode字符。

例如,如果您需要使用“ã”或“ü”字符,则使用“\w”将不起作用。

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

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

这应该在大多数情况下工作。

/^[\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-跨字符串全局匹配并且不区分大小写

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

所需格式

允许这三个:

  1. 0142171547295
  2. 014-2171547295
  3. 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()"/>

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

  • ^匹配以任何字符开头的字符串

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

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

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