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

发布于 2024-10-27 06:39:25 字数 436 浏览 1 评论 0原文

我对正则表达式感到头疼,所以希望有人可以帮助我。我正在做一些文件语法转换,并且文件中出现了这种情况:

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

我想匹配标记内“关键字”的所有实例。标记区域是重复的,关键字可以出现在其他位置,但我不想匹配标记之外的区域。我似乎无法解决的是如何让正则表达式提取所有匹配项。我可以让一个人完成第一个或最后一个任务,但不能完成所有任务。我相信这应该是可能的,并且这与重复捕获组有关 - 有人可以向我展示光明吗?

我正在使用 grepWin,它似乎支持所有附加功能。

I'm getting a regex headache, so hopefully someone can help me here. I'm doing some file syntax conversion and I've got this situation in the files:

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

I want to match all instances of "keyword" inside the markers. The marker areas are repeated and the keyword can appear in other places, but I don't want to match outside of the markers. What I don't seem to be able to work out is how to get a regex to pull out all the matches. I can get one to do the first or the last, but not to get all of them. I believe it should be possible and it's something to do with repeated capture groups -- can someone show me the light?

I'm using grepWin, which seems to support all the bells and whistles.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

朕就是辣么酷 2024-11-03 06:39:25

您可以使用:

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

这将匹配 OpenMarkerCloseMarker 中的关键字(使用选项“点匹配换行符”)。

You could use:

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

this will match the keyword inside OpenMarker and CloseMarker (using the option "dot matches newline").

GRAY°灰色天空 2024-11-03 06:39:25

sed -n -e '/OpenMarker[[:space:]]*CloseMarker/p' /path/to/file | grep 关键字 应该可以工作。不确定 grep 是否可以单独做到这一点。

sed -n -e '/OpenMarker[[:space:]]*CloseMarker/p' /path/to/file | grep keyword should work. Not sure if grep alone could do this.

对岸观火 2024-11-03 06:39:25

只有少数正则表达式引擎支持重复组的单独捕获(例如.NET)。因此,最好的选择是分两步执行此操作:

首先匹配您感兴趣的部分:OpenMarker(.*?)CloseMarker(使用选项“点匹配换行符”)。

然后重复应用另一个正则表达式来匹配:keyword (.*)(这次没有选项“点匹配换行符”)。

There are only a few regex engines that support separate captures of a repeated group (.NET for example). So your best bet is to do this in two steps:

First match the section you're interested in: OpenMarker(.*?)CloseMarker (using the option "dot matches newline").

Then apply another regex to the match repeatedly: keyword (.*) (this time without the option "dot matches newline").

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文