正则表达式:懒惰,但不够懒惰

时间:2013-03-01 16:46:38

标签: regex

我希望有一些可以提供帮助的正则表达式专家。我一直在寻找几个小时但找不到答案。

这是输入字符串:

parameters:x,y,123,z;parameters:a,b,456,c;

难题是检索最后一个参数部分(a,b,456,c),我知道它以"参数开始:"并以",c";

结束

所以我尝试了以下正则表达式:

parameters:(.+?,c);

这不是预期的最后一部分,而是从第一个参数开始。这是匹配组:

x,y,123,z;parameters:a,b,456,c

那么?做一个懒惰的比赛并不够懒,因为它比我想要的更多。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

正则表达式正是你所定义的:它匹配“参数”然后懒惰直到它找到的第一个“c”。

试试这个:

parameters:([^;]+,c);

[^;]是一个否定的字符类,它匹配每个字符但“;”。看起来 ;在这样一个群体中不可能发生。

here on Regexr

答案 1 :(得分:3)

最简单的方法是禁止匹配:;

parameters:([^:;]+,c);

或者你可以更明确地禁止parameters匹配两次:

parameters:((?:(?!parameters).)+,c);

你的正则表达式不够懒惰的原因是正则表达式匹配从尽可能早的位置开始,.+?尽可能匹配(从字符串中的第一个parameters:开始,正是你找到它匹配的字符串。)