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

标签 regex

http://regexr.com/3ars8

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

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

它将正确匹配:

ABCDF31U100027743

并正确拒绝匹配:

AB$DF31U100027743

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

但显然会允许:

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

所以,this regex (使用 i 选项)不会捕获您的字符串。

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

在我看来,使用 Ignorecase 选项来避免此类问题并缩短正则表达式总是更安全。

关于regex - 为什么这个正则表达式允许插入符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34787060/

相关文章:

javascript - 如何使用正则表达式匹配带空格和不带空格的字符串?

regex - 抓取 '../'(点斜线)

python - 如何在python中从文件名的下划线后提取特定数字

C# 正则表达式匹配示例

regex - 为什么正则表达式模式 "\r","\n","\s","[\n\r]"不能命中此中断行?

Python 正则表达式匹配非 ascii 名称

python - 根据字符模式在 python 中打破字符串

java - 在 Java 正则表达式中 - 如何仅在附加到字符串时保留数字

python - 用Python重新挖掘信息

javascript - 如何选择字符串中的最后一个数字?