正则表达式非重复二元组

时间:2019-01-20 17:25:18

标签: regex pcre regex-group

我希望PCRE正则表达式创建类似于question的双字对,但是没有重复的单词。

Full Match: apple orange plum
Group 1: apple orange
Group 2: orange plum

我最接近的是这个,但是第二组中没有捕捉到“橙色”。

(\b.+\b)(\g<1>)\b

1 个答案:

答案 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李子”,因为它们都满足该条件。

Full explanation of my original regex at Regex101