我有一个以逗号分隔的字符串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(使用前将#替换为@)