如果第一次出现的模式与条件不匹配,如何使匹配失败?

2024-02-09

我有一个以逗号分隔的字符串key=value像这样的对:

foo=1,foo=1,bar=2

在这个字符串中我想捕获的值first foo,但前提是紧随其后的是bar=2.

例子:

  • 在此字符串中,值1应该捕获:

     baz=0,foo=1,bar=2,foo=3,bar=4
    
  • 在此字符串中,不应捕获任何内容:

     baz=0,foo=1,foo=1,bar=2
    

我当前的解决方案使用调和的贪婪令牌,但这迫使我复制foo=[^,]*,正则表达式的一部分:

^(?:(?!foo=[^,]*,).)*foo=([^,]*),bar=2(?:,|$)

有没有办法做到这一点,而不必复制正则表达式的这么大一部分?


这很容易回溯控制动词 https://perldoc.pl/perlre#Special-Backtracking-Control-Verbs:

(?<![^,])foo=([^,]*)(*COMMIT),bar=2(?![^,])

我们匹配前面没有非逗号字符的位置(即字符串的开头或紧随其后),), 其次是foo=,后跟 0 个或多个非逗号字符(我们捕获的)。这是foo=... part.

然后我们承诺找到的第一个匹配项并要求,bar=2匹配,后面不跟非逗号字符(即,或字符串的末尾)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果第一次出现的模式与条件不匹配,如何使匹配失败? 的相关文章

随机推荐