【问题标题】:Can regex match Interleaved matches? [duplicate]正则表达式可以匹配交错匹配吗? [复制]
【发布时间】:2018-07-17 16:34:50
【问题描述】:

我有一个带有开始标签和结束标签的模式
例如/*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 来查找重叠匹配项还是我需要编写自己的代码?

【问题讨论】:

  • 听起来像recursion in Regex
  • @WiktorStribiżew 只是它会找到它......(我会自己检查实际的重叠)只是所有匹配项的索引和长度
  • revo.. 太棒了...把它作为答案。
  • @WiktorStribiżew 你是部分正确的,匹配不包括整个表达式。但无论如何我都会遍历捕获组,所以我确实有我需要的位置。

标签: c# regex match overlap


【解决方案1】:

Lookarounds 确实断言而不是消耗字符。然而,捕获组仍然在其中存储匹配的部分。只需将重叠部分放在正向前瞻中即可:

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

Live demo

【讨论】:

  • 谢谢,这正是我需要的
【解决方案2】:
(?=\*([a-zA-Z0-9]+)_START\*\/(.*?)\/\*(\1)_END\*)

您将不得不使用前瞻而不捕获任何内容。请参阅演示。

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

【讨论】:

  • @TomerW 这不起作用
猜你喜欢
  • 2010-09-13
  • 2017-10-04
  • 2013-06-30
  • 2011-02-04
  • 2020-07-25
  • 1970-01-01
相关资源
最近更新 更多