如何编写正则表达式来重复捕获较大匹配的组?

问题描述:

我得到了一个正则表达式头痛,所以希望有人能帮助我。我做了一些文件语法转换,我已经得到了在文件中这样的情况:如何编写正则表达式来重复捕获较大匹配的组?

OpenMarker 
    keyword some expression 
    keyword some expression 
    keyword some expression 
    keyword some expression 
    keyword some expression 
CloseMarker 

我想匹配的“关键字”标记内的所有实例。标记区域重复出现,关键字可以出现在其他地方,但我不想在标记之外进行匹配。我似乎无法解决的是如何得到一个正则表达式来取消所有的比赛。我可以让一个人做第一个或最后一个,但不能得到所有的人。我相信这应该是可能的,而且这与重复的捕捉小组有关 - 有人能给我看光吗?

我正在使用grepWin,它似乎支持所有的花里胡哨。

你可以使用:

(?<=OpenMarker((?!CloseMarker).)*)keyword(?=.*CloseMarker) 

这将匹配keywordOpenMarkerCloseMarker(使用选项 “点相匹配换行”)。

+0

好主意,如果grepWin在lookbehind内部支持无限重复。 – 2011-03-30 10:14:29

+0

它似乎不支持可变长度lookbehind。我将在.NET中推出自己的代码以访问具有此功能的正则表达式引擎,但我会将其标记为答案。 – mwtb 2011-03-30 22:57:07

sed -n -e '/OpenMarker[[:space:]]*CloseMarker/p' /path/to/file | grep keyword应该工作。不知道是否只有grep可以做到这一点。

只有少数正则引擎支持重复组的独立捕获(例如.NET)。所以你最好的选择是分两步做到这一点:

首先匹配你感兴趣的部分:OpenMarker(.*?)CloseMarker(使用选项“dot matches newline”)。

然后重复应用另一个正则表达式:keyword (.*)(这次没有选项“dot matches newline”)。