Задать вопрос

Почему не срабатывает регулярное выражение?

Всем привет.
Чет не могу понять, делаю по книге, но столкнулся с проблемой работы регулярки:

Есть файл:
1234XX1234
1234XX1234

Регулярка: ^[0-9][0-9][0-9][0-9]XX[0-9][0-9][0-9][0-9] находит данные строки
Регулярка: [0-9]\{4\}XX[0-9]{4\} не находит ничего
Регулярка: ^[0-9]\{4\}XX[0-9]{4\} не находит ничего

Делаю так: grep [0-9]\{4\}XX[0-9]{4\} test.txt

В чем ошибка?? Спасибо
  • Вопрос задан
  • 73 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Zzzz9
А так grep -E [0-9]{4}XX[0-9]{4} test.txt
Ответ написан
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Ошибка - в экранировании последней фигурной скобки.
Алгоритм RegExp видит экранирование, поэтому считает эту фигурную скобку несущественной, из-за этого RegExp выражение становится некорректным (не закрыта фигурная скобка), оно не обрабатывается.

Проверяется очень просто: https://regex101.com/r/nfsYd5/1
Зайдите, и удалите последнее экранирование, и выражение сразу засияет всеми красками заработает!
Ответ написан
Lynn
@Lynn
nginx, js, css
Ошибка в том, что сначала ваш ввод «портится» bash-ем. Лучше всегда использовать строки в одиночных кавычках, если не нужно что бы их обработал bash.

В вашем примере grep [0-9]\{4\}XX[0-9]{4\} test.txt сначала обработается bash-ем, он уберёт обратные слеши и сам grep попадёт выражение уже без обратных слешей [0-9]{4}XX[0-9]{4} и очевидно не срабатывает. Что бы обратный слеш добрался до grep надо его экранировать ещё одним обратным слешом
$ grep [0-9]\\{4\\}XX[0-9]\\{4\\} test.txt
1234XX1234
1234XX1234

Но проще использовать кавычки
$ grep "[0-9]\{4\}XX[0-9]\{4\}" test.txt
1234XX1234
1234XX1234

а ещё лучше использовать режим расширенных (как предложил Zzzz9) или perl-совместимых регулярных выражений
$ grep -E "[0-9]{4}XX[0-9]{4}" test.txt
1234XX1234
1234XX1234
$ grep -P "\d{4}XX\d{4}" test.txt
1234XX1234
1234XX1234

(хотя для последнего нужно хорошо знать и уметь регулярки)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы