Что означает ведущая звездочка в расширенных и базовых регулярных выражениях?
Какова семантика * в начале RE? Документировано ( man 7 regex), что для базовых RE это соответствует только * (то есть он превращается в обычный символ), но что происходит с расширенными RE? Из примеров видно, что у него та же семантика ".*", Но я не могу найти никакого источника для этого.
prompt> echo "hello" | grep -E '*'
hello
prompt> echo "hello" | grep '*'
prompt>
3 ответа
Что касается стандарта, результаты не определены:
*+?{
<asterisk>,<plus-sign>,<question-mark>, а также<left-brace>должны быть особенными, за исключением случаев, когда они используются в выражении в скобках (см. RE выражение в скобках) Любое из следующих применений приводит к неопределенным результатам:
- Если эти символы появляются первыми в ERE или сразу после
<vertical-line>,<circumflex>, или же<left-parenthesis>- Если
<left-brace>не является частью правильного выражения интервала (см. ERE, соответствующие нескольким символам)
Любая попытка последовательно объяснить, что происходит в этом случае, будет зависеть от реализации. Судя по ответу @kos, они, вероятно, соответствуют пустому регулярному выражению.
Заметить, что echo "hello" | grep -E '*' возвращается hello потому что строка совпадает и grep возвращает всю строку, а не потому что * такой же как .*, Вы должны проверить с -Eo:
% echo "hello" | grep -Eo '*'
%
У меня нет источников для резервного копирования этого, но не слишком дикое предположение, основанное на практическом тесте, предполагает, что последовательность кванторов в начале регулярного выражения просто игнорируется:
% echo "*hello" | grep -Eo '*'
% echo "+hello" | grep -Eo '+'
% echo "?hello" | grep -Eo '?'
% echo "{1}hello" | grep -Eo '{1}'
1}
% echo "***hello" | grep -Eo '***'
% echo "*+?{1}hello" | grep -Eo '*+?{1}hello'
1}hello
Моя подсказка добавляет возвращаемое значение в начале строки в случае, если возвращаемое значение отличается от 0так что это все совпадения.
grep -E 'regex' показать строки, содержащие соответствующее регулярное выражение, и выделит совпадения красным цветом.
принимая это во внимание, grep -E '*' покажет все строки с нулем или более "(ничего)" в нем.
grep '*' просто покажет линии со звездой в нем.