Regexp,用于返回列表中两个连续项的任意组合



我的输入类似

aa,bb,cc,dd

我想获得

aa,bb
bb,cc
cc,dd

到目前为止,我了解了懒惰和贪婪的运算符,还了解了前瞻断言。

(?=([^,]+,[^,]+))

但我得到的比赛比预期的要多。我做错了什么?

我赞同@mdsl关于不使用正则表达式的评论,但我很快就想出了一些应该有效的方法。

(?=(?!^)b[^,]+,)([^,]+)K
n1

演示:RegEx或PHP


解释:

(?=     (?# start lookahead)
 (?!^)  (?# negative lookahead for the start of the string)
 b     (?# assert for word boundary)
 [^,]+  (?# match 1+ non-, characters)
 ,      (?# match ,)
)       (?# end lookahead)
(       (?# start capture group)
 [^,]+  (?# match 1+ non-, characters)
)       (?# end capture group)
K      (?# throw away everything to the left)

这里最重要的是,前瞻性实际上并不匹配任何内容,这意味着我们可以重叠匹配(aa,bbbb,cc等(。由于这种前瞻性,它将在第一组aa。。这就是CCD_ 4断言的作用。然而,现在它将把aa一分为二,除非我们确保[^,]+组前面有一个单词边界(你可以看到这是如何变得有点快的(。最后,K用于丢弃所有东西,因为我们实际上并不想替换任何东西。

(?=(b[^,]+b,b[^,]+b))

演示:http://regex101.com/r/zJ4mA9

[^,]+,[^,]+

[^,]+检查下一个不包含逗号的令牌;后面的下一个字符必须是逗号(或初始字符串的末尾(

,捕获逗号

[^,]+捕获之后的下一个令牌。

最新更新