O que significa um asterisco principal em expressões regulares estendidas e básicas?

4

Quais são as semânticas de * no início de um RE? Está documentado ( man 7 regex ) que, para REs básicas, ele corresponde apenas a * (ou seja, ele se transforma em um ordinário caractere), mas o que acontece para REs estendidos? Por exemplos, parece que tem a mesma semântica de '. *', Mas não consigo encontrar nenhuma fonte para isso.

prompt> echo "hello" | grep -E  '*'
hello
prompt> echo "hello" | grep  '*'
prompt> 
    
por VeryHardCoder 06.03.2016 / 17:44

3 respostas

8

No que diz respeito ao padrão , os resultados são undefinido :

  

*+?{

     

A <asterisk> , <plus-sign> , <question-mark> e    <left-brace> deve ser especial, exceto quando usado em um suporte   expressão (consulte Expressão do suporte RE ). Qualquer um dos seguintes usos   produzir resultados indefinidos:

     
  • Se esses caracteres aparecerem primeiro em um ERE ou imediatamente após um <vertical-line> , <circumflex> ou <left-parenthesis>
  •   
  • Se um <left-brace> não fizer parte de uma expressão de intervalo válida (consulte EREs que correspondem a vários caracteres )
  •   

Qualquer tentativa de explicar consistentemente o que acontece neste caso ficaria à mercê da implementação. Indo pela resposta do @kos, eles provavelmente correspondem à expressão regular vazia.

    
por muru 06.03.2016 / 18:43
5

Observe que echo "hello" | grep -E '*' retorna hello porque a string é uma correspondência e grep retorna a linha inteira, não porque * seja igual a .* . Você deve testar com -Eo :

% echo "hello" | grep -Eo '*' 
% 

Não tenho fontes para fazer backup disso, mas uma suposição não muito complexa baseada em um teste prático sugere que uma sequência de quantificadores no início da expressão regular é ignorada:

% 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

Meu prompt preenche o valor de retorno no início da linha no caso de um valor de retorno diferente de 0 , então essas são todas correspondências.

    
por kos 06.03.2016 / 18:36
2

O grep -E 'regex' mostra linhas que contêm a regex correspondente e realça as correspondências na cor vermelha.

levando isso em consideração, grep -E '*' mostrará todas as linhas com zero ou mais '(nada)'.

grep '*' mostrará apenas as linhas com a estrela.

    
por Mostafa Ahangarha 06.03.2016 / 18:46

Tags