用于返回列表上两个连续项的任意组合的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