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

Why is this regex allowing a caret?

regexr.com 3ars8 http:/ /

1
^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$

匹配的"17"alphanumeric字符,字符不允许,必须包括至少一个与至少一个号码"

这将正确的匹配:

1
ABCDF31U100027743

它和正确匹配:

1
AB$DF31U100027743

(和几乎任何其他非alphanumeric炭)

但问题是:

1
AB^DF31U100027743


因为您的字符类[A-z]与此符号匹配。

[A-z]匹配[\]^_`和英文字母。

实际上,这是一个常见的错误。你应该用[a-zA-Z]来代替只允许英文字母。

下面是Expresso的可视化,显示了[A-z]的实际范围:

screenshot from Expresso showing the ASCII table, where you can see what the [A-z] range actually covers

所以,这个regex(带有i选项)不会捕获您的字符串。

1
^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$

在我看来,使用Ignorecase选项来避免此类问题并缩短regex总是比较安全的。


regex uses ASCII printable characters from the space to the tilde range.

每当我们使用[A-z]标记时,它都与下表中突出显示的字符相匹配。如果我们使用[ -~]令牌,它将从SPACE到tilde匹配。

enter image description here


您允许a-z(大写字母"A"到小写字母"Z")。您不必说您使用的是什么regex包,但不一定清楚a-z和a-z是连续的;中间可能还有其他字符。试试这个:

1
^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$

这似乎符合你对我在雷杰帕尔的标准。