Regex “.*?” давая тот же вывод как “.*”

Это файл я использую:

Shane is a little to play ball
small
silly

Когда я использую

egrep 's.*l' new

Я получаю вывод как

Shane is a little to play ball
small
silly

Когда я использую

egrep 's.*?l' new

Я получаю тот же вывод как выше, но это должно отличаться.

0
задан 13 September 2018 в 09:45

2 ответа

Хотя Вы говорите, что "это должно отличаться", Вы забыли говорить, что производит Вас, ожидают. Насколько я знаю, возможные интерпретации ? в регулярном выражении:

  • В основном регулярном выражении (BRE), ? литеральный вопросительный знак; так как Ваш вход не содержит таких символов, вывода grep 's.*?l' new будет пусто.

  • В расширенном регулярном выражении (ERE), ? нуль значения квантора или один из предыдущего regex атома. В этом случае, .*? означает "нуль или больше отдельных символов (.*), повторенный нуль или одно время (?)" - это эквивалентно .*, и следовательно egrep 's.*?l' и egrep 's.*l' произведет идентичный вывод.

  • В жемчуге совместимом регулярном выражении (PCRE), ? модификатор жадности, такой что .*? в s.*?l соответствует самой короткой последовательности символов между s и l тогда как жадное s.*l соответствует самому длинному такая последовательность. Следовательно

    $ grep -P 's.*?l' new
    Shane is a little to play ball
           ^^^^^
    

    в то время как

    $ grep -E 's.*?l' new
    Shane is a little to play ball
           ^^^^^^^^^^^^^^^^^^^^^^^
    

Для простых случаев можно достигнуть "лени" без PCRE ? модификатор при помощи отрицаемого набора символов т.е.

grep 's[^l]*l' new

будет соответствовать s сопровождаемый любыми символами кроме l, сопровождаемый l.


В СТОРОНЕ: egrep технически удерживается от использования - необходимо привыкнуть использовать плоскость использования grep для BRE, grep -E поскольку ДО, и grep -P для PCRE.

6
ответ дан 27 October 2019 в 23:33

Простыми словами существуют регулярные выражения POSIX и затем существуют различные расширения, такие как Совместимые с Perl регулярные выражения (PCRE), которые реализованы на многих языках (не просто Perl). Нежадный модификатор *? PCRE-определенное расширение. В регулярных выражениях POSIX это не будет иметь никакого особого значения, и это просто расценит? как избыточный.

В grep можно легко переключиться на режим PCRE с -P модификатор командной строки.

0
ответ дан 27 October 2019 в 23:33

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

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