Где поддерживается поисковое регулярное выражение, а где нет?

Пытаясь улучшить свои навыки работы с регулярными выражениями, я хотел узнать о выражениях просмотра вперед и назад. В моей системе Archlinux я пробовал следующее:

a=ab;if [[ $a =~ [a-z](?=b) ]]; then echo "Y";else echo "N";fi

Что, насколько я понимаю, должно совпадать и, таким образом, повторять "Y", но не соответствует.

echo ab |sed 's/[a-z](?=b)/x/'

... тоже не похоже. grep вроде тоже не осматривается, а pcregrep да. Я также пробовал несколько попыток цитирования и/или экранирования выражений, но безрезультатно.

Я немного сбит с толку. Может ли кто-нибудь пояснить, где на самом деле можно использовать обходной путь, который не кажется этой экзотикой, судя по количеству упоминаний в туториалах? Или я просто ошибся, избегая выражений?


person some-non-descript-user    schedule 27.12.2015    source источник
comment
Я бы порекомендовал «Мастерство регулярных выражений» Джеффри Э. Ф. Фридла; это моя базовая ссылка на регулярное выражение. Я также использую (regular-expressions.info) и (rexegg.com) в качестве онлайн-справочников и (regex101.com) или (regexr.com) в качестве живых тестеров для экспериментов. Они могут быть вам полезны.   -  person rivy    schedule 28.12.2015


Ответы (2)


Утверждения Lookaround не поддерживаются базовыми или расширенными регулярными выражениями posix, доступными в bash или sed.

Хорошим инструментом для тестирования является GNU grep, который поддерживает параметр -P для perl-совместимых регулярных выражений. Как это:

grep --color=auto -P '[a-z](?=b)' <<< 'ab'

Еще большим ресурсом являются онлайн-инструменты для тестирования регулярных выражений, такие как https://regex101.com/.

person hek2mgl    schedule 27.12.2015
comment
Так что lookaround — это больше функция Perl-Regex? - person some-non-descript-user; 27.12.2015
comment
@some-non-descript-user Правильнее сказать, что Perl поддерживает обходы. - person Maroun; 27.12.2015
comment
@some-non-descript-user Существуют также другие механизмы регулярных выражений, которые поддерживают обходы, такие как Java, .NET, python и т. Д. Однако регулярные выражения POSIX не поддерживают обходы. - person hek2mgl; 27.12.2015

Следует различать базовые и расширенные регулярные выражения.

В основных регулярных выражениях метасимволы ?, +, {, |, ( и ) теряют свое особое значение; Их нужно экранировать, чтобы получить их значение «regex».

С другой стороны, в расширенных регулярных выражениях эти символы получают значение "regex".

Если вы grep --help, вы получите:

-E, --extended-regexp ШАБЛОН — это расширенное регулярное выражение (ERE).

Обратите внимание, что grep не поддерживает обход, он поддерживается в pcregrep.

person Maroun    schedule 27.12.2015
comment
Спасибо за предупреждение о расширенных регулярных выражениях. - person some-non-descript-user; 27.12.2015