Что означает ведущая звездочка в расширенных и базовых регулярных выражениях?
Какова семантика *
в начале 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 '*'
просто покажет линии со звездой в нем.