Eu tenho essa regex aaa.+?(?>bbb)j
e essa string de entrada aaa xxx bbby xxx bbbj
. Quando executo essa regex, ela retorna aaa xxx bbby xxx bbbj
MAS, como usei um grupo atômico, (?>bbb)
a regex deveria ter falhado, porque li online que, ao usar um grupo atômico, o interpretador de regex não retrocede.
Então, ao encontrar o primeiro bbb
na string de entrada, ele deve "ficar" com ele, então ele verificará a próxima letra e será y
que não é a pretendida, j
então ele deve desistir e falhar. No entanto, por algum motivo, o interpretador regex continua tentando e, eventualmente, encontra o último bbbj
. Como posso fazê-lo falhar no primeiro bbb
que encontrou?
OBSERVAÇÃO: Tentei usar o quantificador ganancioso/preguiçoso, mas não fez diferença no caso acima.
Dentro de um grupo atômico, o backtracking é independente e não relacionado a nenhuma outra parte
das outras partes da expressão.
Portanto,
bbb
corresponderá independentemente.A expressão dentro de um grupo atômico é uma expressão separada que mantém seu próprio estado
com relação ao backtracking. Quando se depara com o mesmo território na fonte,
ele corresponderá exatamente ao mesmo texto todas as vezes.
Por exemplo,
(?>bbb?)
sempre corresponderábbb
quando se deparar com isso.Como é uma expressão separada real, ela pode voltar atrás dentro de si mesma
para corresponder o máximo que puder.
A única razão pela qual
(?>bbb)j
não correspondeubbby
quando o encontrou é porqueestava procurando o
j
, no entanto obbb
foi correspondido. O mecanismo avançou para encontrá-lo mais adiante depois disso.Observe também que as asserções também são atômicas por natureza, com uma condicional aplicada.
Você combina quase tudo com lazy de antemão (considerando que . não corresponde a uma nova linha).
O grupo atômico só vem depois. Faça todo o padrão também atômico para atingir seus resultados.
Agora, a correspondência lenta no grupo atômico garante que você não pule a primeira sequência bbb correspondente e o teste geral é uma falha de correspondência, pois o retrocesso para aaa falha imediatamente.
Ou talvez você queira algo assim (não ficou totalmente claro para mim quando li a pergunta pela primeira vez):