^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$
应匹配“17 个字母数字字符,也允许连字符,必须至少包含一个字母和至少一个数字”
它将正确匹配:
ABCDF31U100027743
并正确拒绝匹配:
AB$DF31U100027743
(以及几乎任何其他非字母数字字符)
但显然会允许:
AB^DF31U100027743
最佳答案
因为你的字符类 [A-z]
匹配这个符号。
[A-z]
匹配 [
, \
, ]
, ^
, _
、`
和英文字母。
实际上,这是一个常见的错误。您应该使用 [a-zA-Z]
来只允许英文字母。
这是 Expresso 的可视化效果,显示了 [A-z]
实际涵盖的范围:
所以,this regex (使用 i
选项)不会捕获您的字符串。
^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$
在我看来,使用 Ignorecase
选项来避免此类问题并缩短正则表达式总是更安全。
关于regex - 为什么这个正则表达式允许插入符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34787060/