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

时间:2011-03-30 01:19:33

标签: windows regex grep

我正在接受正则表达式的头痛,所以希望有人可以帮助我。我正在进行一些文件语法转换,我在文件中遇到了这种情况:

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

我希望匹配标记内的所有“关键字”实例。重复标记区域,关键字可以出现在其他地方,但我不想在标记之外匹配。我似乎无法解决的是如何获得正则表达式以取出所有匹配。我可以让一个人做第一个或最后一个,但不是为了得到所有这些。我相信它应该是可能的,它与重复的捕获组有关 - 有人能告诉我光明吗?

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

3 个答案:

答案 0 :(得分:3)

您可以使用:

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

这将匹配keywordOpenMarker内的CloseMarker(使用“点匹配换行”选项)。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

只有少数正则表达式引擎支持重复组的单独捕获(例如.NET)。因此,最好的办法是分两步完成:

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

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