正则表达式可以匹配Interleaved匹配吗?

时间:2018-02-07 11:40:30

标签: c# regex match overlap

我有一个带开口标签和关闭标签的模式 例如/*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不会返回两个标记,因为它从匹配的最后一个字符继续...

我可以使用Regex查找重叠匹配,还是需要编写自己的代码?

2 个答案:

答案 0 :(得分:1)

Lookarounds会断言而不是消耗字符。但是,捕获组仍会在其中存储匹配的部分。只需将重叠部分放在积极的前瞻中:

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

Live demo

答案 1 :(得分:0)

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

你必须使用前瞻而不是捕捉任何东西。参见演示。

https://regex101.com/r/vsA3ZU/1