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 caaacabe eu procurar por a.*?bela, 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"
abcabkea.+?k, RegEx corresponderá a toda a string.