小编典典

正则表达式中的重叠匹配

c#

我似乎找不到这个问题的答案,而且我想知道是否存在。简化示例:

考虑一个字符串“ nnnn”,在这里我想找到所有“ nn”的匹配项,但还要查找彼此重叠的匹配项。因此,正则表达式将提供以下3个匹配项:

  1. nn nn
  2. n nn n
  3. nn nn

我意识到这并不是正则表达式的确切含义,但是考虑到实际上匹配必须使用模式(而不是文字字符串)来完成,因此遍历字符串并手动解析它似乎是很多代码。


阅读 1127

收藏
2020-05-19

共1个答案

小编典典

一个可能的解决方案是在后面使用正面的外观

(?<=n)n

它会给您以下的最终位置:

    • n * n nn
  1. n * n * n n
  2. nn * n * n

正如Timothy Khouri所提到的 ,
积极的前瞻 更加直观

我更喜欢他的主张(?=nn)n,更简单的形式是:

(n)(?=(n))

那将引用您想要的字符串的 第一个位置并捕获group(2)中的第二个n

之所以这样,是因为:

  • 可以在lookahead内部使用任何有效的正则表达式。
  • 如果包含捕获括号, 则将保存反向引用

因此,group(1)和group(2)将捕获’n’表示的任何内容(即使它是一个复杂的正则表达式)。

2020-05-19