не уверен, в чем проблема с этим «регулярным выражением» в команде оболочки «grep»

#regex #linux #bash #shell #grep

Вопрос:

Это была моя попытка:

 grep -i 'th[D]{1,}'
 

Я на хакеррАнке. У меня есть этот файл, который доставлен в мой stdin.

Мне нужны в результате строки, которые содержат :

 the
that
then
those
 

Комментарии:

1. Существует много разных диалектов регулярных выражений, и вы используете неправильный. grep использует «Базовое регулярное выражение Posix (BRE)», а не «Регулярное выражение, совместимое с Perl (PCRE)», которое вы, похоже, используете

2. С помощью BRE вы можете писать [D] как [^[:digit:]] для «без цифр».

3. Если вы используете GNU grep, вы можете использовать -P опцию использования PCRE.

4. Как вам пришло в голову это регулярное выражение? Это очень необычно для цели, которую вы описали. Разве это не the|that|then|those был бы очевидный путь?

5. @Ayoub_Prog: Смотрите здесь допустимый синтаксис базового регулярного выражения. Вы увидите, что его нет D в наличии.

Ответ №1:

В шаблоне POSIX BRE, когда вы используете «класс сокращенных символов» s , например w , даже в GNU grep , эти escape-последовательности рассматриваются как отдельные символы, обратная косая черта и буква. [D]{1,} соответствует одной или нескольким D буквам или символам.

Вам нужно точно соответствовать словам, которые вам говорят:

 grep -i -E '<(the|that|then|those)>'
 

Здесь,

  • -i — позволяет сопоставлять без учета регистра
  • -E — включает синтаксис POSIX ERE
  • < — откройте границу слова
  • (the|that|then|those) — группа захвата s, соответствующая любому слову между | (ИЛИ) операторами чередования
  • > — закрыть границу слов.

Комментарии:

1. команда grep по умолчанию использует POSIX BRE, а фигурные скобки {} поддерживаются ERE not BRE, не означает ли это, что вы должны добавить опцию-E для использования ERE вместо этого ?

2. @Ayoub_Prog Если мы добавим -E , это будет выглядеть так grep -i -oE '<th[[:alpha:]] ' file

3. @Ayoub_Prog наконец-то это сработало для тебя?

4. @Ayoub_Prog Я обновил рабочий шаблон.

5. @Bohemian Это хакерское упражнение, которое grep -i -E '<th[a-z] ' вызывает «Неправильный ответ :(» ответ. grep -i -E '<th(e|at|en|ose)>' это то же самое регулярное выражение, что и у меня, только переработанное, чтобы быть менее читаемым.