我的输入类似
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,bb
、bb,cc
等(。由于这种前瞻性,它将在第一组aa
。。这就是CCD_ 4断言的作用。然而,现在它将把aa
一分为二,除非我们确保[^,]+
组前面有一个单词边界(你可以看到这是如何变得有点快的(。最后,K
用于丢弃所有东西,因为我们实际上并不想替换任何东西。
(?=(b[^,]+b,b[^,]+b))
演示:http://regex101.com/r/zJ4mA9
[^,]+,[^,]+
[^,]+
检查下一个不包含逗号的令牌;后面的下一个字符必须是逗号(或初始字符串的末尾(
,
捕获逗号
[^,]+
捕获之后的下一个令牌。