正则表达式可以匹配交替匹配吗?

3

我有一个带有开放标签和闭合标签的模式
例如:/*tag1_START*/ some content /*tag1_END*/ other text /*tag2_START*/ some content /*tag2_END*/

我使用正则表达式\/\*([a-zA-Z0-9]+)_START\*\/(.*?)\/\*\1_END\*

可以在regex101中查看

但是,当标签交叉(错误)时,情况变得复杂:
例如:/*tag3_START*/ some /*tag4_START*/ content /*tag3_END*/ other /*tag4_END*/ content

我可以轻松检查匹配中的重叠部分,但是 REGEX 不会返回两个标签,因为它从上次匹配的最后一个字符继续匹配...

我能否使用正则表达式找到重叠的匹配,还是需要编写自己的代码?


听起来像是正则表达式中的递归 - Uwe Keim
1
在这里使用前后查找 \/\*([a-zA-Z0-9]+)_START\*\/(?=(.*?)\/\*\1_END\*) - revo
@WiktorStribiżew 只是它会找到它...(我会自己检查实际的重叠部分)只需返回所有匹配项的索引和长度 - Tomer W
重新...太棒了...将其作为答案。 - Tomer W
@WiktorStribiżew 你部分正确,匹配不包括整个表达式。但是我仍然遍历捕获组,所以我有我需要的位置。 - Tomer W
2个回答

2

向前/向后查找断言不会消耗字符,而捕获组仍会在其中存储匹配的部分。只需将重叠部分放在正向先行断言内即可:

\/\*([a-zA-Z0-9]+)_START\*\/(?=(.*?)\/\*\1_END\*)

实时演示


谢谢,这正是我所需要的。 - Tomer W

0

@TomerW 这个没有起作用 - vks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接