正面观察在正则表达式中“工作得太好”

时间:2012-03-06 22:33:43

标签: regex lookbehind

模式匹配超出预期。如果有任何人可以解释为什么'地址'匹配,当它是看守的一部分以及如何防止它。提前感谢您提供任何帮助。

模式:

(?<=@address|)[a-zA-Z]+(?=[^\]\[]*\])

字符串:

test [@address|singleline second] test

结果:

address singleline second

2 个答案:

答案 0 :(得分:3)

您需要转义|

(?<=@address\|)[a-zA-Z]+(?=[^\]\[]*\])

因为(?<=@address|)断言匹配字符串前面是@address或空字符串。 (并且因为所有 总是前面都是空字符串,所以没有效果。)

顺便说一下,一个小的术语:(?<=@address|)被称为后面,而不是前面的 。看看提前断言,例如你的(?=[^\]\[]*\]),断言正则表达式中的给定点是(或不是)跟随指定的模式。

答案 1 :(得分:0)

甚至不需要环顾四周。

您似乎希望结果为“单行”。 (你的令牌a-zA-Z只是字母,内部数据是空格分隔的,整个模式就是那个。)

并解决|是静态的。

所以,为什么不少看看,只是消费

/@address\|(\w+).*?\]/g   //$1 has the capture.
除了更简单之外,还有一个可能的好处:如果你必须在大量数据上全局运行,那么你已经匹配到最后],而不是最后一个e '单线'。

相关问题