正则expression式中的重叠匹配

我似乎无法find这个问题的答案,我想知道如果存在。 简单的例子:

考虑一个string“nnnn”,在那里我想find所有匹配的“nn” – 也是那些相互重叠的。 所以正则expression式将提供以下3个匹配项:

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

我意识到这不正是什么正则expression式的意思,但走string和手动parsing这似乎是一个非常大量的代码,考虑到实际上匹配将不得不使用模式,而不是字面string。

一个可能的解决scheme可能是使用积极的背后 :

(?<=n)n 

它会给你的结局:

  1. * N ***ñ** NN
  2. N * N ***ñ** N
  3. NN * N ***ñ**

正如蒂莫西·库里 ( Timothy Khouri)所提到的, 积极的前瞻更直观

我更喜欢他的主张(?=nn)n更简单的forms:

 (n)(?=(n)) 

这将引用你想要的string的第一个位置并捕获组(2)中的第二个n

那是因为:

  • 任何有效的正则expression式都可以在lookahead中使用。
  • 如果它包含捕获括号,反引用将被保存

因此,组(1)和组(2)将捕获任何“n”表示(即使它是一个复杂的正则expression式)。

使用一个捕捉组的前瞻作品,代价是让你的正则expression式变得更慢更复杂。 另一种解决scheme是告诉Regex.Match()方法,下一个匹配尝试应该开始。 尝试这个:

 Regex regexObj = new Regex("nn"); Match matchObj = regexObj.Match(subjectString); while (matchObj.Success) { matchObj = regexObj.Match(subjectString, matchObj.Index + 1); } 

AFAIK,没有一个纯粹的正则expression式的方式来做到这一点(即返回三个捕获你请求没有循环)。

现在,你可以find一个模式,并循环search开始偏移量(find位置+ 1)。 应结合正则expression式使用简单的代码。

[编辑]太好了,当我基本上说了Jan显示的时候,我是低调的。
[编辑2]要清楚:Jan的答案是更好的。 不是更精确,但肯定更详细,值得select。 我只是不明白为什么我被低估,因为我还没有看到任何不正确的东西。 没什么大不了,只是烦人。