Regex Недвойные Биграммы - PullRequest
       15

Regex Недвойные Биграммы

0 голосов
/ 20 января 2019

Я хочу, чтобы регулярное выражение PCRE создавало пары биграмм, подобные этому вопросу , но без дублирующих слов.

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

Самое близкое, что я получил, это, но 'Оранжевый не захватывается во второй группе.

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

1 Ответ

0 голосов
/ 20 января 2019

Вы ищете это:

/(?=(\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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...