2014-01-22 78 views
0

我總是對如何正確使用正面和負面的外觀感到困惑。我搜索了互聯網,發現大多數例子令人困惑。我想知道有人能幫助我。正則表達式正面還是負面的Lookbehinds?

我在想,如果我有像下面這樣的正則表達式:

StartHere(?<result>.+?)StopHere 

然後「StartHere」和「StopHere」一審的第一個實例之間的一切都將被解析出來解析出。但是,如果我有多個「StartHere」之類的以下文件中:

StartHere RandomTextAndOtherCharacters StartHere TextIWantToParse PleastStopHere 

如果我使用上述正則表達式將解析「RandomTextAndOtherCharacters StartHere TextIWantToParse」。

有沒有辦法只解析出「TextIWantToParse」壁櫥「StartHere」和「StopHere」之間的信息?我知道?在。+?使它懶惰,但有可能做這樣的事情,但看起來在後面?讓我知道我的解釋是否令人困惑。謝謝。

回答

0

問題是你的字符串是從左到右分析的。一個竅門,以獲得你想要的東西:

StartHere((?>[^S]+|S(?!tartHere|topHere))*)StopHere 
0

試試這個:

(?i)(?!.*(starthere))(?<=(starthere)).*(?=(stophere)) 

下面是負前瞻,以確保什麼是捕捉不含starthere,這將確保它使用最接近startherestophere

(?!.*(starthere)) 

然後你有你的積極的回顧後,積極先行在A .*中間

+0

如果在同一行上有多個有效的'starthere'和'stophere'對,並且所有這些對都必須被捕獲,這會出現問題。 – nhahtdh

+0

哦,我明白你的意思了!我的印象只有一個 – Srb1313711

0

這應該做你想要什麼:

StartHere((?:(?!StartHere|StopHere).)+)StopHere 

(?!StartHere|StopHere).意味着之前我們匹配的字符,我們會檢查是否有StartHereStopHere正前方。一旦遇到StartHereStopHere,重複將被停止。這可確保匹配的文本位於最左邊最接近的對之間StartHere/StopHere

這是代碼清晰度方面最乾淨的解決方案。但是,當遇到StartHere時,它會做無用的回溯。

的微小變化可以使防止:

StartHere((?>(?:(?!StartHere|StopHere).)+))StopHere 

非回溯組(?>pattern)不允許回溯。在這種情況下,它將不允許回溯到重複中,這意味着當遇到StartHere時不會再有無用的回溯。

相關問題