我的输入就像
aa,bb,cc,dd
我想获得
aa,bb
bb,cc
cc,dd
到目前为止,我学习了懒惰和贪婪的操作符,但也了解了前瞻性断言。
(?=([^,]+,[^,]+))
但我不断得到比预期更多的比赛。我做错了什么?
答案 0 :(得分:3)
我是第二次@ mdsl关于不使用正则表达式的评论,但我很快就掀起了一些应该有用的东西。
(?=(?!^)\b[^,]+,)([^,]+)\K
\n\1
<强>解释强>
(?= (?# 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
之后放置一个换行符。这就是(?!^)
断言的用途。但是,现在它会将aa
分成两半,除非我们确保[^,]+
组前面有一个单词边界(你会看到它有多快了)。最后\K
用于抛弃一切,因为我们实际上并不想替换任何东西。
答案 1 :(得分:2)
[^,]+\,[^,]+
[^,]+
检查下一个不包含逗号的标记;后面的char必须是逗号(或初始字符串的结尾)
\,
捕获逗号,
[^,]+
会在之后捕获下一个标记。
答案 2 :(得分:2)
(?=(\b[^,]+\b,\b[^,]+\b))