Нежадное сопоставление с grep

Насколько мне известно, не жадное сопоставление не является частью базового регулярного выражения (BRE) и расширенного регулярного выражения (ERE). Тем не менее, поведение на разных версиях grep (BSD и GNU), кажется, предлагает другое мудрое.

Например, давайте возьмем следующий пример. У меня есть строка сказать:

string="hello_my_dear_polo"

Использование GNU grep:

Ниже приведены несколько попыток извлечь hello из строки.

Попытка BRE:

$ grep -o "hel.*\?o" <<< "$string"
hello_my_dear_polo

Выходные данные дают всю строку, которая предполагает, что не жадный квантификатор не работает на BRE. Обратите внимание, что я только сбежал ? поскольку * не теряет смысла и не нуждается в спасении.

ERE попытка:

$ grep -oE "hel.*?o" <<< "$string"
hello_my_dear_polo

Включение -E Опция также дает тот же результат, предполагая, что не жадное сопоставление не является частью ERE. Экранирование здесь не было нужно, так как мы используем ERE.

Попытка PCRE:

$ grep -oP "hel.*?o" <<< "$string"
hello

Включение -P Опция для PCRE предполагает, что некожадный квантификатор является его частью, и, следовательно, мы получаем желаемый результат hello, Экранирование здесь не нужно, так как мы используем PCRE.

Использование BSD grep:

Вот несколько попыток извлечь hello из строки.

Попытка BRE:

$ grep -o "hel.*\?o" <<< "$string"

Используя BRE я не получаю вывод от BSD grep,

ERE попытка:

$ grep -oE "hel.*?o" <<< "$string"
hello

После включения -E вариант, я удивлен, что мне удалось извлечь желаемый результат. Мой вопрос о том, что я получаю от этой попытки.

Попытка PCRE:

$ grep -oP "hel.*?o" <<< "$string"
usage: grep [-abcDEFGHhIiJLlmnOoPqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]

С помощью -P опция дала мне ошибку использования, которая ожидалась, так как опция BSD grep не поддерживает PCRE.

Так что мой вопрос, почему бы использовать ERE на BSD grep выдает правильный вывод с использованием не жадного квантификатора, но не с GNU grep,

Это ошибка, недокументированная особенность BSD egrep или мое неправильное понимание вывода?

1 ответ

Решение

Двойной квантификатор является просто синтаксической ошибкой и может привести к сообщению об ошибке или неопределенному поведению. Возможно, было бы лучше, если бы вы получили сообщение об ошибке.

Расширения Perl для регулярного выражения POSIX после даты с большим отрывом; в то время, когда были написаны эти инструменты, было крайне маловероятно, что кто-то попытается использовать этот дурацкий синтаксис для чего-либо. Жадное сопоставление было введено только в Perl 5, в середине 1990-х годов.

Другие вопросы по тегам