扩展和基本正则表达式中的前导星号是什么意思?

扩展和基本正则表达式中的前导星号是什么意思?

*RE 开头的语义是什么?有文档记录 (人 7 正则表达式) 它只匹配基本 RE *(即,它变成普通字符),但对于扩展 RE 会发生什么?通过示例,它看起来具有与 '.*' 相同的语义,但我找不到任何来源。

prompt> echo "hello" | grep -E  '*'
hello
prompt> echo "hello" | grep  '*'
prompt> 

答案1

据,直到...为止标准就结果而言不明确的

*+?{

、、、和 应为特殊符号<asterisk><plus-sign>但用于括号表达式时除外(请参阅<question-mark><left-brace>RE 括号表达式)。以下任何一种使用方式都会产生未定义的结果:

  • 如果这些字符首先出现在 ERE 中,或者紧跟在<vertical-line><circumflex>或之后<left-parenthesis>
  • 如果 a<left-brace>不是有效区间表达式的一部分(参见匹配多个字符的 ERE

任何试图一致解释这种情况发生的情况的尝试都将取决于实现。根据@kos的回答,它们可能匹配空的正则表达式。

答案2

请注意,因为字符串匹配,所以echo "hello" | grep -E '*'返回整行,而不是因为与相同而返回。您应该使用进行测试:hellogrep*.*-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,我的提示会将返回值添加到行首,因此这些都是匹配的。

答案3

显示grep -E 'regex'包含匹配的正则表达式的行并以红色突出显示匹配项。

考虑到这一点,grep -E '*'将显示所有包含零个或多个“(无)”的行。

grep '*'只会显示其中有星号的线条。

相关内容