^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$
Run Code Online (Sandbox Code Playgroud)
应该匹配"17个字母数字字符,也允许使用连字符,必须包含至少一个字母和至少一个数字"
它会正确匹配:
ABCDF31U100027743
Run Code Online (Sandbox Code Playgroud)
并正确拒绝匹配:
AB$DF31U100027743
Run Code Online (Sandbox Code Playgroud)
(以及几乎任何其他非字母数字字符)
但显然会允许:
AB^DF31U100027743
Run Code Online (Sandbox Code Playgroud)
Wik*_*żew 143
因为您的角色类[A-z]符合此符号.
[A-z]比赛[,\,],^,_,`,和英文字母.
实际上,这是一个常见的错误.您应该使用[a-zA-Z]仅允许英文字母.
这是来自Expresso的可视化,显示了范围[A-z]实际涵盖的内容:
![Expresso的屏幕截图显示了ASCII表,您可以在其中查看[Az]范围实际涵盖的内容](https://i.stack.imgur.com/qXDLz.png)
所以,这个正则表达式(带i选项)不会捕获你的字符串.
^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$
Run Code Online (Sandbox Code Playgroud)
在我看来,使用Ignorecase选项来避免这样的问题并缩短正则表达式总是更安全.
Pre*_*raj 16
正则表达式使用从空格到波浪范围的ASCII可打印字符.
每当我们使用[A-z]令牌时,它都会匹配下表突出显示的字符.如果我们使用[ -~]令牌,则匹配从SPACE波浪号开始.
你允许Az(资本'A'通过较低'z').你没有说你正在使用什么正则表达式包,但不一定清楚AZ和az是连续的; 中间可能还有其他角色.试试这个:
^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$
Run Code Online (Sandbox Code Playgroud)
它似乎符合你在regexpal中的标准.