猿问

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

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

http://regexr.com/3ars8

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

应匹配“17个字母数字字符,连字符也允许,必须包括至少一个字母和至少一个数字”。

它将正确匹配:

ABCDF31U100027743

并正确地拒绝匹配:

AB$DF31U100027743

(和几乎任何其他非字母数字字符)

但显然会允许:

AB^DF31U100027743


慕的地8271018
浏览 825回答 3
3回答

墨色风雨

因为你的角色类[A-z]匹配这个符号。[A-z]火柴[, \, ], ^, _, `和英文字母。事实上,这是一个常见的错误。你应该用[a-zA-Z]相反,只允许英文字母。这里是Expresso的可视化,显示了范围[A-z]实际上包括:所以,这个判据(与i选项)不会捕获您的字符串。^(?=.*[0-9])(?=.*[a-z])[0-9a-z-]{17}$在我看来,使用它总是更安全。Ignorecase避免这样的问题并缩短regex的选项。

largeQ

regex使用从空格到倾斜范围的ASCII可打印字符。无论何时我们使用[A-z]它与下表高亮显示的字符匹配。如果我们用[ -~]标记与从SPACE向倾斜。

跃然一笑

你允许A-z(大写‘A’从下‘z’)。您没有说明正在使用的regex包,但不一定清楚A-Z和a-z是否是连续的;在这两者之间可能还有其他字符。试一试:^(?=.*[0-9])(?=.*[A-Za-z])[0-9A-Za-z-]{17}$这似乎符合你对我的要求。
随时随地看视频慕课网APP
我要回答