Eu tenho muita confusão na expressão regular e estou tentando resolvê-los. Aqui eu tenho a seguinte string:
{start}do or die{end}extended string
Meus dois regexes diferentes, onde eu só mudei a posição do ponto:
(.(?!{end}))* //returns: {start}do or di
//^ See here
((?!{end}).)* //returns: {start}do or die
//^ See here
Por que o primeiro regex come o último "e"?
E também como essa antecipação negativa torna esse quantificador não-ganancioso? Por que não pode consumir caracteres além de {end}?
Respostas:
2 para resposta № 1Com o seu lookahead negativo, você diz que é impossível corresponder ao regex, que no seu caso é: {end}
. E .
captura tudo, exceto nova linha.
Então, com o seu primeiro regex:
(.(?!{end}))*
Deixa de fora e
, Porque: e{end}
não pode corresponder por causa do lookahead negativo. Enquanto em seu segundo regex, onde você tem o ponto do outro lado, pode até: {end}d
então o e
está incluído no seu segundo regex.
1 para resposta № 2
Eu imaginei um fluxo de trabalho para o mecanismo regex para o regex ao concluir a tarefa ...
Primeiro, por (.(?!{end}))*
a abordagem para o motor regex da seguinte forma ...
"{start}do or die{end}extended string"
^ .(dot) matches "{" and {end} tries to match here but fails.So "{" included
"{start}do or die{end}extended string"
^ . (dot) matches "s" and {end} tries to match here but fails.So "s" included
....
....so on...
"{start}do or die{end}extended string"
^ (dot) matches "e" and {end} here matches "{end}" so "e" is excluded..
so the match we get is "{start}do or di"
para o secex regex ((?! {end}).) * ....
"{start}do or die{end}extended string"
^ {end} regex tries to match here but fails to match.So dot consumes "{".
"{start}do or die{end}extended string"
^ {end} regex tries to match here but fails again.So dot consumes "s".
....
..so on..
"{start}do or die{end}extended string"
^ {end} regex tries to match here but fails.So dot consumes the "e"
"{start}do or die{end}extended string"
^ {end} regex tries to match here and succeed.So the whole regex fail here.
So we ended up with a match which is "{start}do or die"