为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

为什么这个正则表达式允许插入符号?http://regexr.com/3ars8^(?=.*[0-9])(?=.*[A-z])[0-9A-z-]{17}$应匹配“17个字母数字字符,连字符也允许,必须包括至少一个字母和至少一个数字”。它将正确匹配:ABCDF31U100027743并正确地拒绝匹配:AB$DF31U100027743(和几乎任何其他非字母数字字符)但显然会允许:AB^DF31U100027743
查看完整描述

3 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

因为你的角色类[A-z]匹配这个符号。

[A-z]火柴[\]^_`和英文字母。

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

这里是Expresso的可视化,显示了范围[A-z]实际上包括:

https://img1.sycdn.imooc.com//5cf4dde30001479104250122.jpg

所以,这个判据(与i选项)不会捕获您的字符串。

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

在我看来,使用它总是更安全。Ignorecase避免这样的问题并缩短regex的选项。


查看完整回答
反对 回复 2019-06-03
?
largeQ

TA贡献2039条经验 获得超7个赞

regex使用从空格到倾斜范围的ASCII可打印字符。

无论何时我们使用[A-z]它与下表高亮显示的字符匹配。如果我们用[ -~]标记与从SPACE向倾斜。

https://img1.sycdn.imooc.com//5cf4ddf60001162203610562.jpg


查看完整回答
反对 回复 2019-06-03
?
跃然一笑

TA贡献1826条经验 获得超6个赞

你允许A-z(大写‘A’从下‘z’)。您没有说明正在使用的regex包,但不一定清楚A-Z和a-z是否是连续的;在这两者之间可能还有其他字符。试一试:

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

这似乎符合你对我的要求。


查看完整回答
反对 回复 2019-06-03
  • 3 回答
  • 0 关注
  • 811 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信