Dê uma olhada nesta regex bem simples em https://regex101.com/r/jt7KGW/1
Quero corresponder a todas as strings que começam com letter q
e obter tudo depois da letter q
, mas não pode conter xxx
. Eu criei esta regex, que funciona muito bem:
/q(.+?)(?=xxx)/
Se eu testar essa regex com a string, q111xxxx q222xxx q333xxx
receberei de volta 111
, 222
and 333
(como você pode ver no link acima). No entanto, se a string de entrada for q111xxxx q222xxx q333
(eu removi o último xxx
) eu só receberei de volta 111
and 222
mas eu realmente preciso da última correspondência (que é 333
).
Depois de estudar por quase 2 horas, cheguei a esta solução abaixo que você pode conferir em https://regex101.com/r/7SYo4x/1
q(?:(?:.+?)(?=xxx)|.+$)
O que é muito feio e nada eficiente. Existe uma maneira melhor de fazer isso?
A maneira como eu faria isso é:
coloque a letra
q
em uma expressão lookbehind:(?<=q)
... então você não precisa usar grupos de captura ou não captura para excluí-la de suas correspondências.ajuste sua expressão de lookahead
(?=xxx)
para incluir sequências adicionais que podem encerrar uma correspondência:\W
é qualquer caractere não verbal, como um espaço$
é o fim da cordaEntão a expressão final é:
Aqui está no Regex101
Você pode usar isto. (Versão mais curta)
regex101.com
Existe outra opção sem usar um grupo de captura, que servirá para
\K
"esquecer" o que foi correspondido até agora:Veja uma demonstração do regex101
Observe que se você usar
.+?
para o quantificador e tiver essa string,qxxxx
você ainda corresponderá ao primeirox
porque o ponto pode corresponder a qualquer caractere.