至少包含一个数字的字母数字混合字符串的正则表达式

5
我正在寻找满足以下条件的正则表达式:
  • a) 至少包含13个字母数字字符
  • b) 最多包含17个字母数字字符
  • c) 至少包含1个数字。
这个正则表达式已经满足a)和b)的条件,如何才能满足条件c)呢?
^[a-zA-Z0-9]{13,17}$

示例输入文本:

# matching
123456789abcd
123456789abcdef
123456789abcdefg

# no match: too long
123456789abcdefgef

# no match: no digit
abcdefghijklmno

# no match: not alphanumeric only
123456789@abcdefg

这里使用的是Java 8版本。


1
我还会对两个独立的正则表达式进行基准测试。一个针对a)和b)的复杂正则表达式与一个简单的仅检查至少一个数字的正则表达式进行比较。可能比使用单个更复杂的正则表达式更快。 - Zoli Szabó
2个回答

4

听起来你正在尝试制作一个密码检查器。我建议不要试图仅使用一个正则表达式完成它。

将输入与两个不同的正则表达式进行匹配,这两个表达式都必须匹配:

^[a-zA-Z0-9]{13,17}$        # 13-17 alphanumerics

并且

[0-9]                       # at least one digit

相较于另一个回答中提出的建议...

^(?=[a-zA-Z]*[0-9])(?=[0-9]*[a-zA-Z])[[:alnum:]]{13,17}$

这样做会更加清晰易懂,而且当您的规则在未来发生变化时,更容易进行修改。


3

正则表达式:

^(?=[a-zA-Z]*[0-9])(?=[0-9]*[a-zA-Z])[[:alnum:]]{13,17}$

解释: ^(?=[a-zA-Z]*[0-9]) - 向前检查,查找字符串中至少有一个数字跟着零个或多个字母,在速度方面比另一个答案中建议的 (?=.*[0-9]) 更快。

(?=[0-9]*[a-zA-Z]) - 如上,但是要至少有一个字母(我假设你想要它,尽管在你的回答中没有具体说明)。

[[:alnum:]]{13,17}$ - 实际匹配部分;这只是你的正则表达式 ([a-zA-Z0-9]{13,17}$) 的简写。

如果一个字符串更可能 包含字母,则交换向前检查的顺序应该会使它更快。如果缺少数字最有可能导致正则表达式失败 (因为正则表达式会更快地失败),则当前顺序最好。

详细解释请参见https://www.rexegg.com/regex-lookarounds.html#password

正则表达式测试


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接