减少正则表达式的贪婪

时间:2012-03-12 20:05:35

标签: regex greedy

我有以下字符串:

$/Mycollection/Branches/Dev/New/php/MySite/src/MySite/somefolder/src/sad.php

我需要创建正则表达式模式并在第一次出现“src”之前采取一切。

我试过像.+(src)那样使用,但据我所知,我需要减少贪婪,任何人都可以帮忙吗?

3 个答案:

答案 0 :(得分:3)

您可以使用this正则表达式:(.*?)src并仅使用第一个捕获的组。

答案 1 :(得分:1)

你很亲密。你可以这样做......

(^.+?)src

然后获取捕获的第一组的值。


你也可以这样做......

src.+

然后将匹配替换为""

例如(在C#中)......

string value = Regex.Replace(yourstring, "src.+", "");

使用此方法实际上效率更高。对于第一种方法(至少在.NET中),它每秒将进行大约100万次迭代,而每秒进行150,000次迭代。这部分是因为使用捕获组会产生一些开销,部分原因是因为懒惰的?量词会发生回溯。

顺便说一句,我使用Regex Hero然后here's a good article that covers the lazy ? quantifier进行了测试和基准测试。

答案 2 :(得分:0)

在一些现代的正则表达式实现中,.+?是吝啬的,即。在贪婪的量词后添加一个问号,将其改为吝啬。