我总是对如何正确使用积极和消极的后视感到困惑。我搜索了互联网,发现大多数例子令人困惑。我想知道是否有人可以帮助我。
我想知道如果我有如下的正则表达式:
StartHere(?<result>.+?)StopHere
然后解析出“StartHere”的第一个实例和“StopHere”的第一个实例之间的所有内容。但是,如果我在文档中有多个“StartHere”,如下所示:
StartHere RandomTextAndOtherCharacters StartHere TextIWantToParse PleastStopHere
如果我使用上面的正则表达式将解析“RandomTextAndOtherCharacters StartHere TextIWantToParse”。
有没有办法只解析“TextIWantToParse”壁橱“StartHere”和“StopHere”之间的信息?我知道吗?在。+?让它变得懒惰,但有可能做到这样的事情,但却在后面看?如果我的解释令人困惑,请告诉我。感谢。
答案 0 :(得分:0)
问题是你的字符串是从左到右分析的。获得你想要的一个技巧:
StartHere((?>[^S]+|S(?!tartHere|topHere))*)StopHere
答案 1 :(得分:0)
试试这个:
(?i)(?!.*(starthere))(?<=(starthere)).*(?=(stophere))
以下是负面预测,以确保捕获的内容不包含starthere
,这将确保它使用最接近的starthere
到stophere
(?!.*(starthere))
然后你有一个积极的外观和积极的前瞻,中间有一个.*
答案 2 :(得分:0)
这应该做你想要的:
StartHere((?:(?!StartHere|StopHere).)+)StopHere
(?!StartHere|StopHere).
表示在我们匹配某个字符之前,我们会检查前面是StartHere
还是StopHere
。遇到StartHere
或StopHere
后,重复将停止。这可确保匹配的文字位于最左侧,最近的StartHere
/ StopHere
对之间。
这是代码清晰度方面最干净的解决方案。但是,遇到StartHere
时,它会进行无用的回溯。
可以进行一些小改动以防止:
StartHere((?>(?:(?!StartHere|StopHere).)+))StopHere
非回溯群组 (?>pattern)
不允许回溯。在这种情况下,它将禁止回溯到重复,这意味着遇到StartHere
时没有更多无用的回溯。