Вы ищете это:
/(?=(\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
, мы получили бы «яблочный апельсин», но не второе совпадение, потому что обработка регулярного выражения слева направо уже прошла бы над словом «оранжевый»
Если мы опускаем слово break \b
, интерпретатор регулярных выражений выдаст нам «apple orange», а затем «pple orange», «ple orange» и т. Д., Включая «апельсиновую сливу» позже, но также и « диапазон сливы "до" е сливы ", поскольку все они удовлетворяют этому критерию.
Полное объяснение моего оригинального регулярного выражения в Regex101