Как мне создать RegEx, который имеет несколько критериев? - PullRequest
2 голосов
/ 23 июня 2019

Я работаю через лабораторию на RegEx, которая просит меня:

Поиск в файле «стран» для всех слов с девятью символами и буква я.
Сколько результатов найдено?

Я работаю в обычной командной строке Linux в эмулируемой онлайн-среде. Мне разрешено использовать grep, awk или sed, хотя я чувствую предпочтение grep.

(я на 100% новичок, когда дело доходит до RegEx, поэтому пожалуйста объясните мне, как будто мне 5)

В предыдущей лаборатории я уже использовал что-то похожее на приведенное ниже, которое находит меня во всех странах, которые имеют 9 символов, однако я не могу найти способ заставить его найти все слова, которые имеют 9 символов И содержат букву i в любой позиции.

grep -E '\b\w{9}\b' countries

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

Я также пытаюсь придерживаться [] наборов символов, поскольку следующий вопрос требует нескольких букв в 9-буквенном слове.

1 Ответ

1 голос
/ 23 июня 2019

Один из способов решения этой проблемы - дважды использовать grep и передать один результат следующему.

Сначала мы найдем все слова длиной 9, как вы делали в предыдущем упражнении:

grep -Eo '\b\w{9}\b' countries

Я использую флаг o, который перечисляет только совпадающие слова, печатая одно слово в строке.Далее мы используем Linux pipe (не регулярное выражение ИЛИ), чтобы передать выходные данные первого grep второму grep:

grep -Eo '\b\w{9}\b' countries | grep 'i'

Окончательный результат будет состоять из всех словс девятью символами и i.

В зависимости от ваших требований, этот подход может считаться «обманом», если вы больше сосредоточены на Regex, но хорошим решением, если вы также изучаете Linux.


Тот факт, что вы ищете слова усложняет регулярное выражение (в отличие от строк в файле), но также возможно придумать одинрегулярное выражение, чтобы соответствовать этим словам.

 \b(?=\w*i)\w{9}\b

Это основывается на \b\w{9}\b у вас уже есть.(?=\w*i) - это AND условие.После того, как мы находим начало слова (\b), мы смотрим вперед для \w*i (ноль или более букв, а затем наш i).Мы используем \w* в прогнозе, а не .*, поэтому мы смотрим на то же слово .(?=.*i) соответствовало бы любому i также после девяти символов.
После нахождения i мы продолжаем проверять, что слово состоит только из 9 букв.

Рабочий пример: https://regex101.com/r/G5EVdM/1

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