Como faço para dizer ao RegEx (versão .NET) para obter a menor correspondência válida em vez da maior?
Como faço para dizer ao RegEx (versão .NET) para obter a menor correspondência válida em vez da maior?
Respostas:
Para uma expressão regular como .*
ou .+
, acrescente um ponto de interrogação ( .*?
ou .+?
) para corresponder ao mínimo de caracteres possível. Para corresponder opcionalmente a uma seção, (?:blah)?
mas sem corresponder, a menos que seja absolutamente necessário, use algo como (?:blah){0,1}?
. Para uma correspondência repetida (usando {n,}
ou {n,m}
sintaxe), anexe um ponto de interrogação para tentar corresponder o mínimo possível (por exemplo, {3,}?
ou {5,7}?
).
A documentação sobre quantificadores de expressão regular também pode ser útil.
O operador não ganancioso ?
,. Igual a:
.*?
O operador não ganancioso não significa a correspondência mais curta possível:
abcabk
a.+?k
corresponderá a toda a string (neste exemplo) em vez de apenas os três últimos sinais.
Eu gostaria de realmente encontrar a menor correspondência possível.
Essa é a última correspondência possível para ' a
' ainda permitir todas as correspondências para k
.
Acho que a única maneira de fazer isso é usar uma expressão como:
a[^a]+?k
cab
. Se minha entrada for caaacab
e eu procurar por a.*?b
ela, ela retornará a string inteira em vez da correspondência curta interna. Como eu pesquisaria para trás a partir do b
?
START[^START]*?END
(onde START e END são suas regexs de caractere inicial e final). Significa essencialmente "combinar qualquer coisa de INÍCIO a FIM, onde os caracteres intermediários não incluem INICIAR novamente"
abcabk
ea.+?k
, RegEx corresponderá a toda a string.