¿Cómo le digo a RegEx (versión .NET) que obtenga la coincidencia válida más pequeña en lugar de la más grande?
¿Cómo le digo a RegEx (versión .NET) que obtenga la coincidencia válida más pequeña en lugar de la más grande?
Respuestas:
Para una expresión regular como .*
o .+
, agregue un signo de interrogación ( .*?
o .+?
) para que coincida con la menor cantidad de caracteres posible. Para hacer coincidir opcionalmente una sección (?:blah)?
pero sin hacer coincidir a menos que sea absolutamente necesario, use algo como (?:blah){0,1}?
. Para una coincidencia repetida (ya sea usando {n,}
o {n,m}
sintaxis) agregue un signo de interrogación para tratar de hacer coincidir la menor cantidad posible (por ejemplo, {3,}?
o {5,7}?
).
La documentación sobre cuantificadores de expresiones regulares también puede ser útil.
El operador no expansivo, ?
. Al igual que:
.*?
El operador no codicioso no significa la coincidencia más corta posible:
abcabk
a.+?k
coincidirá con la cadena completa (en este ejemplo) en lugar de solo los últimos tres signos.
En su lugar, me gustaría encontrar la coincidencia más pequeña posible.
Esa es la última coincidencia posible para ' a
' para permitir todas las coincidencias k
.
Supongo que la única forma de hacerlo es utilizar una expresión como:
a[^a]+?k
cab
. Si mi entrada es caaacab
y la busco a.*?b
, devolverá la cadena completa en lugar de la coincidencia corta dentro. ¿Cómo buscaría hacia atrás desde el b
?
START[^START]*?END
(donde START y END son las expresiones regulares de los caracteres de inicio y finalización). En esencia, significa "partido cualquier cosa de principio a fin, donde el entre caracteres no incluyen START"
abcabk
ya.+?k
, RegEx coincidirá con toda la cadena.