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

用于返回列表上两个连续项的任意组合的Regexp,regex,Regex,我的意见是 aa,bb,cc,dd 我想获得 aa,bb bb,cc cc,dd 到目前为止,我学习了懒惰和贪婪运算符,还学习了前瞻断言 (?=([^,]+,[^,]+)) 但我得到的比赛比预期的要多。我做错了什么 [^,]+\,[^,]+ [^,]+检查下一个不包含逗号的令牌;后面的下一个字符必须是逗号(或初始字符串的结尾) \,捕获逗号 [^,]+捕获后面的下一个标记。我支持@mdsl关于不使用正则表达式的评论,但我很快想出了一些应该有效的方法 (?=(?!^)\b[^,]+,)([

我的意见是

aa,bb,cc,dd
我想获得

aa,bb
bb,cc
cc,dd
到目前为止,我学习了懒惰和贪婪运算符,还学习了前瞻断言

(?=([^,]+,[^,]+))
但我得到的比赛比预期的要多。我做错了什么

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

\,
捕获逗号


[^,]+
捕获后面的下一个标记。

我支持@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
用于丢弃所有东西,因为我们实际上不想替换任何东西

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

演示:

您为什么要在上面使用RegExp?如果它是一个列表,请按
将其拆分,并像列表一样使用它,而不是像字符串一样使用它。因为它不是拆分而是重叠的match@mdsl他正在寻找所有连续的元素对。@user1352530,查看我的答案。它不使用regexHow就解决了您的问题这些是不使用列表的原因吗?如果有什么不同的话,那就是不使用regexp。使用列表(
a[i],a[i+1]
)比使用RegExp更容易重用。谢谢,这是我已经提供的,我的问题是重叠的组。你怎么知道他使用的是支持
\K
的风格?这样做的人不多。另外,
(?!^)
是一种消极的前瞻,而不是落后。(这两种方法都有效;我只是在更正术语。)很好,catch@Alanmore,我不知道他的口味支持
\K
。我只是选择了它,因为OP应该指定..如果它被标记为已接受,我将致力于一个更通用的解决方案。我认为在测试了一段时间后,甚至不需要内部\b