Regex Недвойные Биграммы
Я хочу, чтобы регулярное выражение PCRE создавало пары биграмм, похожие на этот вопрос, но без дублирующих слов.
Full Match: apple orange plum
Group 1: apple orange
Group 2: orange plum
Самое близкое, что я получил к этому, - это, но "оранжевый" не захвачен во второй группе.
(\b.+\b)(\g<1>)\b
1 ответ
Вы ищете это:
/(?=(\b\w+\s+\w+))/g
Вот быстрый Perl One-Liner, чтобы продемонстрировать это:
$ perl -e 'while ("apple orange plum" =~ /(?=(\b\w+\s+\w+))/g) { print "$1\n" }'
apple orange
orange plum
Это использует упреждения нулевой ширины(?=…)
вокруг группы захвата, чтобы убедиться, что мы можем прочитать слово "оранжевый" дважды.
Если бы мы использовали /(\b\w+\s+\w+)/g
вместо этого мы получили бы "яблочный апельсин", но не второе совпадение, потому что обработка регулярного выражения слева направо уже прошла бы над словом "апельсин"
Если мы опускаем слово разрыв \b
интерпретатор regex даст нам "яблочный апельсин", а затем "pple orange", "ple orange" и т. д., включая "апельсиновую сливу" позже, а также "range plum" через "e plum", поскольку все они удовлетворяют что критерии.
Полное объяснение моего оригинального регулярного выражения в Regex101