为什么这个正则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]实际覆盖的范围:

来自Expresso的屏幕截图显示了ASCII表格,您可以在其中查看[A-Z]范围实际覆盖的内容

所以, 这个正则expression式 (与iselect)不会捕获您的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标准。