Соответствие первым и последним трем символам регулярного выражения (включая перекрытие) - PullRequest
2 голосов
/ 21 апреля 2020

Я пытаюсь собрать выражение регулярного выражения, которое соответствует слову (только одному в строке), которое начинается и заканчивается теми же тремя символами.

Мне удалось написать решение для слов длиной не менее 6 символов (то есть без перекрытия), но я не уверен, как это сделать для перекрывающихся начала и конца, например "хе-хе".

Это то, что у меня есть, просто и красиво: ^(...).*\1$

Я склонен полагать, что это может быть связано с предвкушением и взглядами назад, но я не уверен.

Любая помощь будет оценена, спасибо!

1 Ответ

3 голосов
/ 21 апреля 2020

Вам понадобятся обходные пути , поскольку они являются непотребляющими шаблонами , т. Е. Индекс регулярного выражения не продвигается, когда сопоставляется шаблон поиска.

Например, вы можете сделать это с помощью GNU grep:

grep -P '^(?=(...)).+\1$' file
grep -P '^(?=(\S{3})).+\1$' file # To avoid counting in spaces
grep -P '^(?=(\w{3})).+\1$' file # Or only allowing letters/digits/underscores
grep -P '^(?=(\p{L}{3})).+\1$' file # Or only allowing letters

См. Демонстрационную версию regex

Подробности

  • ^ - начало строки
  • (?=(...)) - положительный прогноз с группой захвата внутри, которая соответствует любым 3 символам
  • .+ - любые символы 1+, кроме символов перевода строки, как можно больше
  • \1 - значение группы 1
  • $ - конец строки.

Чтобы извлечь слова, вы можете использовать \w сокращение (которое соответствует буквам, цифрам и подчеркиванию) и границы слов \b:

grep -oP '\b(?=(\w{3}))\w+\1\b' file

См. еще одну демонстрацию .

Подробности

  • \b - граница слова (здесь начало слова, потому что за ним следуют символы слова)
  • (?=(\w{3})) - a положительный взгляд на то, что при захвате их в Группу 1
  • \w+ - 1+ слов (если не 0 или больше, потому что в противном случае будет найдено 3-символьное слово),
  • \1 - G значение 1 группы
  • \b - конец слова здесь (так как ему предшествует слово chars).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...