为什么这个正则表达式允许插入符号?

Win*_*ute 50 regex

http://regexr.com/3ars8

^(?=.*[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]范围实际涵盖的内容

所以,这个正则表达式(带i选项)不会捕获你的字符串.

^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$
Run Code Online (Sandbox Code Playgroud)

在我看来,使用Ignorecase选项来避免这样的问题并缩短正则表达式总是更安全.


Pre*_*raj 16

正则表达式使用从空格到波浪范围的ASCII可打印字符.

每当我们使用[A-z]令牌时,它都会匹配下表突出显示的字符.如果我们使用[ -~]令牌,则匹配从SPACE波浪号开始.

在此输入图像描述


Mar*_*oli 5

你允许Az(资本'A'通过较低'z').你没有说你正在使用什么正则表达式包,但不一定清楚AZ和az是连续的; 中间可能还有其他角色.试试这个:

^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$
Run Code Online (Sandbox Code Playgroud)

它似乎符合你在regexpal中的标准.