/ / diferença na correspondência devido à posição de lookahead negativo? - javascript, php, regex, string, lookahead

diferença na partida devido à posição de lookahead negativo? - javascript, php, regex, string, lookahead

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 № 1

Com 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"