为什么子字符串会阻止与负先行匹配?
Why do substrings prevent match with negative lookahead?
考虑以下测试数据:
x.foo,x.bar
y.foo,y.bar
yy.foo,yy.bar
x.foo,y.bar
y.foo,x.bar
yy.foo,x.bar
x.foo,yy.bar
yy.foo,y.bar
y.foo,yy.bar
我正在尝试编写一个正则表达式,其中 .foo
之前的字符串和 .bar
之前的字符串彼此 不同 。前三项不应匹配。其他六个应该。
这主要有效:
^(.+?)\.foo,(?!)(.+?)\.bar$
但是,它错过了最后一个,因为 y
在匹配组 1 中,因此 yy
在匹配组 2 中不匹配。
互动:https://regex101.com/r/Pv5062/1
如何修改负先行模式以使最后一项也匹配?
内联反向引用不存储上下文信息,它们只保留捕获的文本。您需要自己指定上下文。
可以在</code>后加一个点:</p>
<pre><code>^(.+?)\.foo,(?!\.)(.+?)\.bar$
^^
或者,甚至重复第二个之后的部分 (.+?)
:
^(.+?)\.foo,(?!\.bar$)(.+?)\.bar$
或者,如果 bar
部分不能包含 .
,您可以将其添加更多 "generic":
^(.+?)\.foo,(?!\.[^.]+$)(.+?)\.bar$
参见regex demo and another regex demo。
要点是:您的 (?!)
不是 "anchored",并且如果存储在第 1 组中的文本立即出现在当前位置的右侧 ,则匹配将失败 上下文。要解决此问题,您需要提供此上下文。由于可以与 .+?
匹配的值几乎可以包含任何您可以依赖的是前瞻后的 "hardcoded" 位。
考虑以下测试数据:
x.foo,x.bar
y.foo,y.bar
yy.foo,yy.bar
x.foo,y.bar
y.foo,x.bar
yy.foo,x.bar
x.foo,yy.bar
yy.foo,y.bar
y.foo,yy.bar
我正在尝试编写一个正则表达式,其中 .foo
之前的字符串和 .bar
之前的字符串彼此 不同 。前三项不应匹配。其他六个应该。
这主要有效:
^(.+?)\.foo,(?!)(.+?)\.bar$
但是,它错过了最后一个,因为 y
在匹配组 1 中,因此 yy
在匹配组 2 中不匹配。
互动:https://regex101.com/r/Pv5062/1
如何修改负先行模式以使最后一项也匹配?
内联反向引用不存储上下文信息,它们只保留捕获的文本。您需要自己指定上下文。
可以在</code>后加一个点:</p>
<pre><code>^(.+?)\.foo,(?!\.)(.+?)\.bar$
^^
或者,甚至重复第二个之后的部分 (.+?)
:
^(.+?)\.foo,(?!\.bar$)(.+?)\.bar$
或者,如果 bar
部分不能包含 .
,您可以将其添加更多 "generic":
^(.+?)\.foo,(?!\.[^.]+$)(.+?)\.bar$
参见regex demo and another regex demo。
要点是:您的 (?!)
不是 "anchored",并且如果存储在第 1 组中的文本立即出现在当前位置的右侧 ,则匹配将失败 上下文。要解决此问题,您需要提供此上下文。由于可以与 .+?
匹配的值几乎可以包含任何您可以依赖的是前瞻后的 "hardcoded" 位。