正则表达式问题:无法正确匹配不含特定子串且满足多条件的字符串
正则表达式修正方案
问题分析
你写的正则之所以会匹配所有字符串,核心问题在于否定预查的位置错误:
.*(?!.*0DS906555B)中,.*是贪婪匹配,会先吃掉大部分字符,然后正则引擎会通过回溯找到一个位置,使得该位置之后没有0DS906555B——哪怕字符串前面已经包含这个子串,回溯后依然能满足断言,导致过滤失效。
修正后的正则表达式
^(?!.*0DS906555B).*2701222122(500[3-9]|501[0-2]).*$
规则拆解
^(?!.*0DS906555B):开头的否定预查,确保整个字符串中不存在0DS906555B,从根源上过滤不符合条件的字符串。.*2701222122:匹配包含目标子串2701222122的内容。(500[3-9]|501[0-2]):精准匹配5003-5012的范围:500[3-9]:覆盖5003到5009501[0-2]:覆盖5010到5012
.*$:匹配后续任意剩余字符。
测试验证
用你的示例字符串测试:
FL_0DS906555B_3661_27012221225012_V001_S:因为包含0DS906555B,会被过滤,不匹配。FL_0DS906555C_3661_27012221225012_V001_S:满足所有条件,会被匹配。
内容的提问来源于stack exchange,提问作者Michal Pivarc
相关产品推荐
相关产品推荐

