正则表达式正面还是负面观察?

时间:2014-01-22 17:01:10

标签: .net regex

我总是对如何正确使用积极和消极的后视感到困惑。我搜索了互联网,发现大多数例子令人困惑。我想知道是否有人可以帮助我。

我想知道如果我有如下的正则表达式:

StartHere(?<result>.+?)StopHere 

然后解析出“StartHere”的第一个实例和“StopHere”的第一个实例之间的所有内容。但是,如果我在文档中有多个“StartHere”,如下所示:

StartHere RandomTextAndOtherCharacters StartHere TextIWantToParse PleastStopHere 

如果我使用上面的正则表达式将解析“RandomTextAndOtherCharacters StartHere TextIWantToParse”。

有没有办法只解析“TextIWantToParse”壁橱“StartHere”和“StopHere”之间的信息?我知道吗?在。+?让它变得懒惰,但有可能做到这样的事情,但却在后面看?如果我的解释令人困惑,请告诉我。感谢。

3 个答案:

答案 0 :(得分:0)

问题是你的字符串是从左到右分析的。获得你想要的一个技巧:

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

答案 1 :(得分:0)

试试这个:

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

以下是负面预测,以确保捕获的内容不包含starthere,这将确保它使用最接近的startherestophere

(?!.*(starthere))

然后你有一个积极的外观和积极的前瞻,中间有一个.*

答案 2 :(得分:0)

这应该做你想要的:

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

(?!StartHere|StopHere).表示在我们匹配某个字符之前,我们会检查前面是StartHere还是StopHere。遇到StartHereStopHere后,重复将停止。这可确保匹配的文字位于最左侧,最近的StartHere / StopHere对之间。

这是代码清晰度方面最干净的解决方案。但是,遇到StartHere时,它会进行无用的回溯。

可以进行一些小改动以防止:

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

非回溯群组 (?>pattern)不允许回溯。在这种情况下,它将禁止回溯到重复,这意味着遇到StartHere时没有更多无用的回溯。