正则表达式为字母数字,但至少有一个字符

mrb*_*lah 21 .net regex

在我的asp.net页面中,我有一个输入框,必须对其进行以下验证:

必须是字母数字,至少包含1个字符(即不能是所有数字).

cle*_*tus 56

^\d*[a-zA-Z][a-zA-Z0-9]*$
Run Code Online (Sandbox Code Playgroud)

基本上这意味着:

  • 零个或多个ASCII数字;
  • 一个字母ASCII字符;
  • 零个或多个字母数字ASCII字符.

尝试一些测试,你会发现这将传递任何字母数字ASCII字符串,其中至少需要一个非数字ASCII字符.

关键在于\d*前方.没有它,正则表达式会变得更加尴尬.

  • 很好的解决方案,cletus.如果你使用不区分大小写的标志,你可以使正则表达式更短:/ ^\d*[az] [a-z0-9]*$/i (5认同)

Phi*_*ert 20

这个问题的大多数答案都是正确的,但有一个替代方案,如果你想在以后更改规则,那么(在某些情况下)会提供更大的灵活性:

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]+)$
Run Code Online (Sandbox Code Playgroud)

这将匹配任何字母数字字符序列,但仅当第一组也匹配整个序列时.它是正则表达式中一个鲜为人知的技巧,允许您处理一些非常困难的验证问题.

例如,假设您需要添加另一个约束:字符串的长度应为6到12个字符.这里发布的明显解决方案不起作用,但使用前瞻性技巧,正则表达式简单地变为:

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]{6,12})$
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 5

^[\p{L}\p{N}]*\p{L}[\p{L}\p{N}]*$
Run Code Online (Sandbox Code Playgroud)

说明:

  • [\p{L}\p{N}]* 匹配零个或多个Unicode字母或数字
  • \p{L} 匹配一个字母
  • [\p{L}\p{N}]* 匹配零个或多个Unicode字母或数字
  • ^$锚定字符串,确保正则表达式匹配整个字符串.您可以省略这些,具体取决于您调用的正则表达式匹配函数.

结果:你可以有任何字母数字字符串,除非必须在某处有一个字母.

\p{L}类似于[A-Za-z]它将包括所有字母表中的所有字母,带或不带重音符号和变音符号.它更具包容性,使用更大的Unicode字符集.如果你不希望这种灵活性替代[A-Za-z].如果您想保持简单\p{N},可以使用类似的注释[0-9].有关更多信息,请参阅字符类MSDN页面.

不那么花哨的非Unicode版本

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

  • \ p {N}将匹配Unicode数字,例如①②.这可能会让一些人感到意外. (4认同)
  • 和\ p {L}也会匹配中文字母.所以,在使用前请三思而后行 (3认同)