为何数字-2231会被正则表达式-?([0-9]|([1-9][0-9]))匹配?
为什么你的正则会匹配
-2231? 这个问题其实是正则匹配模式里的常见误区——默认是部分匹配而非全字符串匹配,我来给你一步步拆解:
首先先明确你的正则表达式-?([0-9]|([1-9][0-9]))的逻辑:
-?:允许开头有一个可选的负号(可以有,也可以没有)- 核心匹配规则:要么是单个0-9的数字,要么是第一位非0、第二位为0-9的两位数字
问题根源:部分匹配 vs 全匹配
正则引擎默认的行为是在目标字符串中寻找任意符合规则的子串,而不是要求整个字符串完全贴合正则规则。
对于-2231这个字符串来说,里面的-22子串完全符合你的正则要求:有负号,后面跟着两位合法的数字(22的第一位是2,不是0),所以这个子串被成功匹配,整个正则表达式就返回“匹配成功”的结果,哪怕字符串后面还有多余的31字符。
如何实现“仅匹配一位或两位数字”的需求?
如果你想要的是整个字符串必须是一位或两位带符号数字,没有多余字符,那需要给正则加上字符串开头和结尾的锚点,强制匹配范围覆盖整个字符串:
^-?([0-9]|([1-9][0-9]))$
这里的^表示字符串的起始位置,$表示字符串的结束位置。用这个正则去匹配-2231就会失败,因为字符串末尾的31超出了正则允许的范围。
内容的提问来源于stack exchange,提问作者Rashad
相关产品推荐
相关产品推荐

