【问题标题】:Regex for alphanumeric, but at least one letter字母数字的正则表达式,但至少一个字母
【发布时间】:2009-06-27 02:25:57
【问题描述】:

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

必须是字母数字,至少有 一个 字母(即不能是 ALL 数字)。

【问题讨论】:

    标签: regex alphanumeric


    【解决方案1】:
    ^\d*[a-zA-Z][a-zA-Z0-9]*$
    

    基本上这意味着:

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

    尝试一些测试,您会发现这将通过任何至少需要一个非数字 ASCII 字符的字母数字 ASCII 字符串。

    关键是前面的\d*。没有它,正则表达式会变得更加尴尬。

    【讨论】:

    • “一个字母数字字符”应该是“一个字母字符”或类似的:正则表达式的那部分不包括数字。
    • @John:不仅聪明,而且高效! \d* 避免了潜在的 O(N**2) 回溯......我认为。
    • 很好的解决方案,cletus。如果您使用不区分大小写的标志,您可以使正则表达式更短,如下所示: /^\d*[a-z][a-z0-9]*$/i
    • 你们是怎么理解的?请建议我如何学习它:(
    • 我找到了这个页面来帮助理解正则表达式ntu.edu.sg/home/ehchua/programming/howto/Regexe.html 来测试正则表达式使用免费的在线测试器freeformatter.com/regex-tester.html
    【解决方案2】:

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

    ^(?=.*[a-zA-Z].*)([a-zA-Z0-9]+)$
    

    这将匹配任何字母数字字符序列,但前提是第一组也匹配整个序列。这是正则表达式中一个鲜为人知的技巧,可让您处理一些非常困难的验证问题。

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

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

    【讨论】:

    • 第二个.*有什么用途?
    • 无 :-) 可以安全地省略。
    • 我知道这是一篇很老的帖子,但这为我今天节省了很多时间和麻烦。注意:在第二种模式中,如果您希望它正确执行,则需要第二个 *。再次感谢。
    • 请注意,两个表达式都不需要第二组括号。无论如何,对于上面的第二个正则表达式,我向你最优秀的先生致敬!
    • 那是病态。谢谢,解决了我的问题;-)
    【解决方案3】:
    ^[\p{L}\p{N}]*\p{L}[\p{L}\p{N}]*$
    

    解释:

    • [\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 page on character classes 了解更多信息。

    不那么花哨的非Unicode版本是

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

    【讨论】:

    • \p{N} 将匹配 Unicode 数字,例如 ① ② 。这可能会让一些人感到意外。
    • 将第一部分 [\p{L}\p{N}]* 转换为 \p{N}* 可以简化解释并防止一些回溯。
    【解决方案4】:
    ^[0-9]*[A-Za-z][0-9A-Za-z]*$
    

    是正则表达式,它会做你所追求的。 ^ 和 $ 匹配单词的开头和结尾以防止其他字符。你可以用 \w 替换 [0-9A-z] 块,但我更喜欢更详细的形式,因为如果你愿意,它更容易用其他字符进行扩展。

    按照 MSDN 上的教程将正则表达式验证器添加到您的 asp.net 页面:http://msdn.microsoft.com/en-us/library/ms998267.aspx

    【讨论】:

    • 这可能包含所有数字,不是吗?
    • 错过了关于需要至少一个字符的额外信息 - 我已经编辑强制至少一个字符
    • 如果不捕获,则不需要 () 除了分组,而 [] 是一个很好的组。 A-z 不仅仅是字母。您的意思可能是 [0-9A-Za-z]*[A-Za-z][0-9A-Za-z]*
    【解决方案5】:
    ^\w*[\p{L}]\w*$
    

    这个并不难。正则表达式读取:匹配以任意数量的单词字符(字母、数字、标点符号(您可能不想要))开头的行,其中包含一个字母字符(即中间的 [\p{L}] 部分),然后是任何单词字符数。

    如果你想排除标点符号,你需要一个更重的表达式:

    ^[\p{L}\p{N}]*[\p{L}][\p{L}\p{N}]*$
    

    如果你不关心 Unicode,你可以使用一个无聊的表达方式:

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

    【讨论】:

    • @R.佩特:谢谢。如果没有错误,它就不是代码。
    【解决方案6】:
    ^[0-9]*[a-zA-Z][a-zA-Z0-9]*$
    

    可以

    • 任何以字符结尾的数字,
    • 或以字符开头的字母数字表达式
    • 或以数字开头、后跟字符并以字母数字子表达式结尾的字母数字表达式

    【讨论】:

    • 这不是和上面的答案一样吗?只需将 \d 替换为 [0-9]。
    • 嗯,是的。我发帖时没看到
    猜你喜欢
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2010-11-02
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多