正则expression式中的重叠匹配
我似乎无法find这个问题的答案,我想知道如果存在。 简单的例子:
考虑一个string“nnnn”,在那里我想find所有匹配的“nn” – 也是那些相互重叠的。 所以正则expression式将提供以下3个匹配项:
- nn nn
- n nn n
- nn nn
我意识到这不正是什么正则expression式的意思,但走string和手动parsing这似乎是一个非常大量的代码,考虑到实际上匹配将不得不使用模式,而不是字面string。
一个可能的解决scheme可能是使用积极的背后 :
(?<=n)n
它会给你的结局:
- * N ***ñ** NN
- N * N ***ñ** N
- 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。 我只是不明白为什么我被低估,因为我还没有看到任何不正确的东西。 没什么大不了,只是烦人。