我怎么能写一个正则expression式来重复捕获一个较大的匹配组?

我得到一个正则expression头痛,所以希望有人能帮助我在这里。 我正在做一些文件语法转换,我在文件中有这种情况:

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

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

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

Solutions Collecting From Web of "我怎么能写一个正则expression式来重复捕获一个较大的匹配组?"

你可以使用:

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

这将匹配OpenMarkerCloseMarker中的keyword (使用“dot matches newline”选项)。

sed -n -e '/OpenMarker[[:space:]]*CloseMarker/p' /path/to/file | grep keyword sed -n -e '/OpenMarker[[:space:]]*CloseMarker/p' /path/to/file | grep keyword应该工作。 不知道如果单独的grep可以做到这一点。

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

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

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