Regex 如何替换重复边界内字符串的所有实例?

Regex 如何替换重复边界内字符串的所有实例?,regex,perl,Regex,Perl,假设我有一根这样的绳子 <other...Stuff> BoundsTag <relevant...Stuff> EndsBoundsTag <other...Stuff> BoundsTag <relevant...Stuff> EndsBoundsTag <other...Stuff> 在这里,我想替换MyMatch的所有实例,除了**之间的实例。我并不是特别指那些字符,***,它们只是为了指出这一点。此外,间距只是为了便于识别。

假设我有一根这样的绳子

<other...Stuff> BoundsTag <relevant...Stuff> EndsBoundsTag <other...Stuff> BoundsTag <relevant...Stuff> EndsBoundsTag <other...Stuff>

在这里,我想替换MyMatch的所有实例,除了
**
之间的实例。我并不是特别指那些字符,
***
,它们只是为了指出这一点。此外,间距只是为了便于识别。

假设这些标签总是成对出现,并且不存在,那么很简单:

/Stuff(?=(?:(?!BoundsTag).)*EndsBoundsTag)/s
仅当
EndsBoundsTag
后面可以匹配,且中间没有
BoundsTag
时,才会匹配
Stuff

在regex101.com上进行现场测试

说明:

Stuff#匹配Stuff
(?=#仅当以下内容随后匹配时:
(?:#1.一组匹配。。。
(?!BoundsTag)#…除非是“BoundsTag”的开头。。。
.#任何角色,
)*#根据需要重复。
EndsBoundsTag#2.EndsBoundsTag也必须在场
)#结束前瞻-如果成功,我们就处于标签之间。

这是可能的。在Perl中,可以使用以下正则表达式:

\*{2}(?![^*]?\*{2})([^*]+?)\*{2}

请参阅。

随预期输出一起发布一个示例。这些对可以嵌套吗?@TimPietzcker问得好,在我的情况下,它们不能每个标记只工作一次。对于
BoundsTag Stuff Stuff EndsBoundsTag
,只有第一个
Stuff
匹配。以上所有内容都与当前OP示例输入和要求无关(没有提到标签中可能重复的内容)。@carlosbubriescas:我更新了我的答案,以满足您更新的要求。这似乎不起作用?我修改了其他帖子的例子来了解我的意思你说的“不起作用”是什么意思,你是怎么尝试的<代码>$subject=~s/MyMatch(?=(?:(!BoundsTag)。*EndsBoundsTag)//sg应该从
$subject
中删除所有
MyMatch
es。之前我尝试过它,但它与任何内容都不匹配。现在,当我从你的评论中尝试你的例子时,它确实匹配。我怀疑我之前犯了一个愚蠢的错误,所以这是我的责任。我道歉。现在,它在第一个边界内匹配,但在第二个边界内不匹配
\*{2}(?![^*]?\*{2})([^*]+?)\*{2}