为什么这个正则expression式允许脱字符?
http://regexr.com/3ars8
^(?=.*[0-9])(?=.*[Az])[0-9A-z-]{17}$
应该匹配“17个字母数字字符,连字符也是允许的,必须包括至less一个字母和至less一个数字”
它会正确匹配:
ABCDF31U100027743
并正确地拒绝匹配:
AB$DF31U100027743
(和几乎任何其他非字母数字字符)
但显然会允许:
AB^DF31U100027743
因为你的angular色类[Az]
匹配这个符号。
[Az]
匹配[, \, ], ^, _, `
和英文字母。
其实这是一个常见的错误。 您应该使用[a-zA-Z]
来代替英文字母。
这里是Expresso的一个可视化,显示范围[Az]
实际覆盖的范围:
所以, 这个正则expression式 (与i
select)不会捕获您的string。
^(?=.*[0-9])(?=.*[az])[0-9a-z-]{17}$
在我看来,使用Ignorecase
选项避免这样的问题并缩短正则expression式总是比较安全的。
正则expression式使用从空格到代字号范围的ASCII可打印字符。
每当我们使用[Az]
令牌时,它就会匹配下面突出显示的字符。 如果我们使用[ -~]
标记,它将从SPACE
到代字号开始匹配。
你允许Az(大写'A'通过'z')。 你不会说你正在使用什么正则expression式包,但不一定很清楚AZ和az是连续的; 之间可能还有其他angular色。 试试这个:
^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$
它似乎符合我的regexpal标准。