用于返回列表中两个连续项的任意组合的正则表达式

时间:2014-05-28 15:24:47

标签: regex

我的输入就像

aa,bb,cc,dd

我想获得

aa,bb
bb,cc
cc,dd

到目前为止,我学习了懒惰和贪婪的操作符,但也了解了前瞻性断言。

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

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

3 个答案:

答案 0 :(得分:3)

我是第二次@ mdsl关于不使用正则表达式的评论,但我很快就掀起了一些应该有用的东西。

(?=(?!^)\b[^,]+,)([^,]+)\K
\n\1

演示: RegExPHP


<强>解释

(?=     (?# 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之后放置一个换行符。这就是(?!^)断言的用途。但是,现在它会将aa分成两半,除非我们确保[^,]+组前面有一个单词边界(你会看到它有多快了)。最后\K用于抛弃一切,因为我们实际上并不想替换任何东西。

答案 1 :(得分:2)

[^,]+\,[^,]+

[^,]+检查下一个不包含逗号的标记;后面的char必须是逗号(或初始字符串的结尾)

\,捕获逗号,

[^,]+会在之后捕获下一个标记。

答案 2 :(得分:2)

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

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