首页 > 解决方案 > 正则表达式非重复二元组

问题描述

我想要一个 PCRE 正则表达式来创建类似于这个问题的二元组配对,但没有重复的单词。

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

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

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

标签: regexpcreregex-group

解决方案


你正在寻找这个:

/(?=(\b\w+\s+\w+))/g

这是一个快速的 perl 单行代码来演示它:

$ perl -e 'while ("apple orange plum" =~ /(?=(\b\w+\s+\w+))/g) { print "$1\n" }'
apple orange
orange plum

这在捕获组周围使用零宽度前瞻 (?=…),以确保我们可以两次读取“橙色”一词。

如果我们/(\b\w+\s+\w+)/g改为使用,我们会得到“apple orange”,但不会得到第二个匹配项,因为正则表达式的从左到右处理已经超过了单词“orange”

如果我们省略单词 break \b,正则表达式解释器会给我们“apple orange”,然后是“pple orange”、“ple orange”等……包括“orange plum”,还有“range plum”到“e李子”,因为这些都满足该标准。

我在 Regex101 上的原始正则表达式的完整解释


推荐阅读