2011-11-18 113 views
5

我想了解更多关于正则表达式的知识。正则表达式:如何在模式的结果上使用lookahead/lookbehind?

我只是试图匹配没有被方括号包围的订单号(#1234但不是[#1234]),但我的问题更多地是关于在任意模式中使用lookahead断言。

在我第一次尝试时,我注意到我的负面超前比赛\d+(?!\])将导致\d+保持匹配的数字,直到它没有跟随]。只有在整体没有跟随]后,我才需要数字匹配。

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

这是一个标准的方式来解决这个问题吗?我只是在前瞻中重复比赛模式。如果这是一个更复杂的正则表达式,我会采用相同的方法吗?重复有效匹配,然后是无效匹配,并让正则表达式引擎为每个字母重复一遍?

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

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

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

我会很感激任何反馈!

+0

不知道你的” ......只有在全部后面没有什么意思一个 ]”。你能否添加一个没有得到你想要的匹配的字符串的例子,以及在这种情况下匹配应该是什么? – Faust

+0

@Faust:我得到了我想要的比赛,我只是觉得我的方法不太好。 Narendra Yadala指出我需要准确防止回溯。谢谢全部 –

回答

8

你可以实现你想要的使用所有格量词与lookarounds沿着这样

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

你的情况的问题是,当你使用\d+它允许回溯和结束有部分匹配#123。一旦您将其改为占有量词,它将不会回溯,并且只有在数字序列没有前后括号的情况下才会匹配。

Live Demo

编辑 如果占有欲量词不支持,你可以使用这个

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

辉煌! '不像一个贪婪的量词,它不会像引擎回溯一样放弃匹配。用占有量词,交易是全部或没有。 “这正是我需要的。我很高兴我问了这个问题:)我会尽快接受。 –

+0

哎呀,刚刚发现蟒蛇重新不支持它......可能会使用我原来的功能,然后:( –

+0

@ YujiTomita增加了一个正则表达式,它将在不支持所有格量​​词时起作用 –

相关问题