我希望PCRE正则表达式创建类似于question的双字对,但是没有重复的单词。
Full Match: apple orange plum
Group 1: apple orange
Group 2: orange plum
我最接近的是这个,但是第二组中没有捕捉到“橙色”。
(\b.+\b)(\g<1>)\b
答案 0 :(得分:3)
您正在寻找这个:
/(?=(\b\w+\s+\w+))/g
下面是一个简短的perl演示:
$ perl -e 'while ("apple orange plum" =~ /(?=(\b\w+\s+\w+))/g) { print "$1\n" }'
apple orange
orange plum
这会在捕获组周围使用零宽度的lookahead (?=…)
,以确保我们可以两次读取“橙色”一词。
如果我们改用/(\b\w+\s+\w+)/g
,则会得到“ apple orange”,而不是第二个匹配项,因为正则表达式的从左到右处理将已经超过了“ orange”一词>
如果我们省略单词break \b
,那么正则表达式解释器将给我们“苹果橙”,然后是“ pple橙”,“ ple橙”等……包括“ orange plum”,但是也是“范围李子”到“ e李子”,因为它们都满足该条件。