O que esse regex faz?
<!--.*?-->
Responder1
Esta expressão regular irá corresponderComentários HTML
Em particular:
<!-- matches literal string "<!--"
. matches any character
* is a quantifier, it means "0 or more" of the previous character
? makes the regex non-greedy, so it matches as few times as possible
--> matches literal "-->"
Então, seu regexp contra este texto:
blah <!-- first --> yaddahyaddah <!-- second --> other random words.
corresponderá apenas a <!-- first -->
.
Verhttp://regex101.com/r/gF7vX2/1
Sem o? corresponderia a tudo entre a primeira ocorrência de <!--
e o final -->
, em outras palavras, corresponderia:<!-- first --> yaddahyaddah <!-- second -->
Responder2
<!--
corresponde aos personagens<!--
literalmente.
corresponde a qualquer caractere (exceto nova linha)*?
é um quantificador que corresponde ao regex anterior entre zero e tempos ilimitados, o menor número de vezes possível, expandindo conforme necessário [preguiçoso]-->
corresponde aos personagens-->
literalmente
Resposta do testador de regexhttp://regex101.com/r/lA1bH5/2
Observe que *
corresponde ao regex anterior entre zero e tempos ilimitados, comomuitosvezes possível. Esta é uma distinção importante. Considere as duas regexs a seguir:
- R:
<!--.*?-->
(aquele sobre o qual você perguntou) - B:
<!--.*-->
E considere a linha de dados D, mostrada abaixo. Regex A encontrará duas correspondências nele; regex B encontra apenas um:
D: <!-- comment one --> HTML <!-- comment two -->
A: (.... match #1 ....) (.... match #2 ....)
B: (................. match #1 .................)
Portanto, a regex B tratará incorretamente o HTML entre os dois comentários como se estivesse em um comentário.