正则表达式:如何在模式的结果上使用lookahead / lookbehind?

时间:2011-11-18 05:26:52

标签: regex

我正在努力了解有关正则表达式的更多信息。

我只是想匹配一个没有括号(#1234而不是[#1234])的订单号,但我的问题更多的是关于在任意模式上使用先行断言。

在我第一次尝试时,我注意到我的否定前瞻匹配\d+(?!\])会导致\d+保持匹配的数字,直到]后面没有。我需要数字才能匹配,只要它们的整数后面没有]

我当前的解决方案通过展望未来数字链中是否有]来杀死第一位数的匹配。

这是一个标准的方法吗?我只是在前瞻中重复匹配模式。如果这是一个更复杂的正则表达式,我会接近它吗?重复有效匹配,然后是无效匹配,让正则表达式引擎为每个字母重复一次吗?

对于有效匹配,它必须与匹配中的字符匹配多次。

(?<!\[) # not preceded by [
#\d+ 
(?!\d*\]) # not followed zero+ digits and ] 

# or (?!\d|\]) # not followed by digit or ]

我很感激任何反馈!

1 个答案:

答案 0 :(得分:8)

你可以通过使用占有量词以及类似这样的外观来实现你想要的目标

(?<!\[)#\d++(?!\])

您的案例中的问题是,当您使用\d+时,它允许回溯并最终获得部分匹配#123。一旦你将其改为占有量词,它就不会回溯,只有在数字序列不在括号之前/之后才匹配。

Live Demo

修改 如果不支持占有量词,那么你可以使用这个

#\d(?<!\[#\d)(?!\d*\])\d*