basex regex: o metacaractere asterisco elimina caracteres de nova linha redundantes

1

Para testar o funcionamento básico do metacaractere asterisco em operações de pesquisa usando grep , usei um arquivo ( regex.txt ) com o seguinte conteúdo:

$ cat regex.txt
1
11
111
1111
11111





$

Há 6 novas linhas após o 11111 no meu exemplo, adicionado intencionalmente.

Pergunta 1.

Por que a saída de grep "11*" regex.txt não inclui as novas linhas após 11111 , diferentemente da saída de grep "1*" regex.txt ?

Pergunta 2.

A saída de grep "111*" regex.txt é

11
111
1111
11111

A saída de grep "1111*" regex.txt é

111
1111
11111

A saída de grep "11111*" regex.txt é

1111
11111

Por que as camadas superiores estão faltando para cada aumento em '1' na chave de pesquisa?

    
por Sudhish Vln 14.11.2015 / 13:37

2 respostas

1

Suas duas perguntas são basicamente as mesmas. Em expressões regulares, * significa "corresponde ao caractere anterior 0 ou mais vezes". Portanto, 1* corresponderá a 0 ou mais 1 , mas 11* corresponderá a 1 seguido por 0 ou mais 1 . Isso significa que

  • grep "11*" imprimirá somente linhas contendo pelo menos um 1 . O * aplica-se apenas ao segundo 1 , portanto, o primeiro é obrigatório. É por isso que você não vê as linhas vazias, elas não correspondem a 1 .

  • grep "1*" corresponderá a 0 ou mais 1 . Aqui, você não tem um caractere anterior que precisa ser correspondido, então as linhas em branco também são correspondidas porque elas contêm 0 1 .

  • grep "111*" , grep "1111*" etc não correspondem pelo mesmo motivo que o primeiro ponto acima. 111* imprimirá apenas linhas contendo pelo menos 2 1 , possivelmente mais. 1111* corresponderá a linhas contendo pelo menos 3 1 , possivelmente mais.

O ponto principal aqui é que o * afeta apenas o caractere imediatamente anterior, não o padrão inteiro. Para dar um quantificador a um padrão inteiro, você pode usar parênteses:

$ grep '\(111\)*' regex.txt 
1
11
111
1111
11111





$    

Aqui, os parênteses (eles precisam ser escapados com \ para que não sejam incluídos no padrão de pesquisa) agrupam os caracteres juntos para que o * seja aplicado ao grupo. Como você vê acima, isso corresponde a linhas contendo 0 ou mais ocorrências de 111 , portanto, imprime todas as linhas.

    
por 14.11.2015 / 13:55
0

'1*' seleciona zero ou mais caracteres que são um. 1 seleciona um caractere que é um. Uma linha em branco não tem nenhum caracter que seja um, mas tem zero caracteres que são um.

    
por 14.11.2015 / 13:54