正则表达式问题排查:为何无法拦截末尾带++或--的输入参数?
正则表达式问题排查:为何无法拦截末尾带++或--的输入参数?
嘿,我来帮你揪出这个问题的根源!
你现在用的正则是这行:
r"^(ABC-\d{2,9})|(ABz?-\d{3})$"
问题出在两个匹配分支的锚定规则不统一上:
- 第一个分支
^(ABC-\d{2,9})只加了开头锚定^,却没加结尾锚定$。这就意味着,只要字符串开头能匹配上ABC-加2到9位数字,不管后面跟了啥(比如你说的++、--,甚至其他乱七八糟的字符),正则都会直接判定“匹配成功”——它只会认前面符合规则的那一段,完全不管后面的多余内容。 - 第二个分支
(ABz?-\d{3})$倒是加了结尾锚定$,所以像AB-123、ABz-123这类输入不会出问题,但第一个分支的漏洞直接拖了后腿,导致带多余字符的ABC-xx++这类输入漏网了。
简单修复方案
把两个分支用括号包起来,然后在整体末尾加上$,让正则要求整个字符串必须完全匹配其中一个分支,不能有任何多余内容:
r"^(ABC-\d{2,9}|ABz?-\d{3})$"
修改后你可以放心:
- 你原本认定的合法输入依然能正常匹配:
- ABC-12
- ABC-123456789
- AB-123
- ABz-123
- 而像
ABC-12++、ABC-987--这类末尾带多余字符的输入,就会因为没法完全贴合规则被拦下来啦。
备注:内容来源于stack exchange,提问作者Tanu
相关产品推荐
相关产品推荐

