Ashok já apontou a diferença entre .*
e .*?
, então só vou fornecer alguma informação adicional.
grep
(assumindo a versão GNU) suporta 4 maneiras de combinar strings:
- Strings corrigidas
- Expressões regulares básicas (BRE)
- Expressões regulares estendidas (ERE)
- Expressões regulares compatíveis com Perl (PCRE)
grep
usa o BRE por padrão.
BRE e ERE estão documentados no capítulo Expressões Regulares do POSIX e o PCRE está documentado em o seu site oficial . Por favor, note que os recursos e a sintaxe podem variar entre as implementações.
Vale dizer que nem o BRE nem o ERE apóiam a preguiça :
The behavior of multiple adjacent duplication symbols ( '+', '*', '?', and intervals) produces undefined results.
Então, se você quiser usar esse recurso, precisará usar o PCRE:
# BRE greedy
$ grep -o 'c.*s' <<< 'can cats eat plants?'
can cats eat plants
# BRE lazy
$ grep -o 'c.*\?s' <<< 'can cats eat plants?'
can cats eat plants
# ERE greedy
$ grep -E -o 'c.*s' <<< 'can cats eat plants?'
can cats eat plants
# ERE lazy
$ grep -E -o 'c.*?s' <<< 'can cats eat plants?'
can cats eat plants
# PCRE greedy
$ grep -P -o 'c.*s' <<< 'can cats eat plants?'
can cats eat plants
# PCRE lazy
$ grep -P -o 'c.*?s' <<< 'can cats eat plants?'
can cats
Editar 1
Could you please explain a little about
.*
vs.*?
?
-
.*
é usado para corresponder ao padrão "mais longo" 1 possível. -
.*?
é usado para corresponder ao padrão "mais curto" 1 possível.
Na minha experiência, o comportamento mais procurado é geralmente o segundo.
Por exemplo, digamos que temos a seguinte string e queremos corresponder apenas as tags html 2 , não o conteúdo entre elas:
<title>My webpage title</title>
Agora compare .*
vs .*?
:
# Greedy
$ grep -P -o '<.*>' <<< '<title>My webpage title</title>'
<title>My webpage title</title>
# Lazy
$ grep -P -o '<.*?>' <<< '<title>My webpage title</title>'
<title>
</title>
1. O significado de "mais longo" e "mais curto" em um contexto de expressão regular é um pouco complicado, como Kusalananda apontou . Consulte a documentação oficial para mais informações.
2. Não é recomendado analisar HTML com regex . Este é apenas um exemplo para fins educacionais, não use na produção.