1

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

Например:


Яблоки вкусные.
Мне нравятся черепахи.
Он высокий.
Она красивая.
Иди к черту!
Черепахи умные.
Это самые красивые здания в мире.
Яблоки полезны для вашего здоровья.
Венгерский флаг представляет собой горизонтальный триколор красного, белого и зеленого цветов.
Черепахи являются рептилиями.
Ты очень умный.
Венгерский - сложный язык.
Бананы и яблоки обычно дешевы.


Если я сделаю регулярное выражение (яблоко | черепаха | венгерский), я получу 8 строк с закладками, но в приведенном выше примере мне нужны только первые вхождения, поэтому я хочу добавить в закладки только следующие предложения:

  • Яблоки вкусные.
  • Мне нравятся черепахи.
  • Венгерский флаг представляет собой горизонтальный триколор красного, белого и зеленого цветов.

Есть ли способ сделать это?

Заранее спасибо.

1 ответ1

0

Хороший вопрос, я должен был пойти и изучить некоторые новые трюки Regex, чтобы получить ответ :)
Я не думаю, что есть способ решить это в одном утверждении регулярного выражения для всех ваших слов одновременно. Мое решение на основе слова в слово. Для 100 ключевых слов ... это все еще может быть управляемым.

Итак, вот оно

\A^.*?(?<!apple).*?\Kapple

Позвольте мне сломать это ...

Мы ищем первое появление яблока

apple

Но без слова apple перед ним, поэтому нам нужно использовать функцию Negative Lookbehind

(?<!apple)apple

Но между ними могут быть и другие символы, и новые строки, поэтому выберите опцию «. Соответствует новой строке» и используйте:

(?<!apple).*?apple

. * Должен быть не жадным, я не совсем уверен, почему ... :)

Новый, из-за этой проблемы (я должен был пойти и попросить выяснить это;)), мы должны привязать наше регулярное выражение к началу файла:

\A^(?<!apple).*?apple

\A - это « постоянное начало строки », в notepad++ оно соответствует началу файла.
Мы также должны добавить ^, чтобы привязать его к первой строке файла.

Конечно, между началом файла и первым появлением яблока могут быть символы, поэтому

\A^.*?(?<!apple).*?apple

И нас интересует только расположение яблока, а не весь шаблон, поэтому мы используем \K, чтобы сохранить соответствие текста настолько далеко от общего соответствия регулярному выражению

\A^.*?(?<!apple).*?\Kapple

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .