RegEx: la coincidencia más pequeña posible o una coincidencia no codiciada

Respuestas:

192

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.

DMI
fuente
7
No sé, si soy el único con este malentendido, pero es importante tener en cuenta: si bien es cierto que el operador no codicioso coincidirá con la menor cantidad de caracteres posible, es posible que no sea la coincidencia que uno está buscando. para. "La menor cantidad de caracteres posible" no equivale a "la coincidencia más corta posible" con respecto a los estándares de RegEx. Vea la respuesta debajo de mi comentario: Con abcabky a.+?k, RegEx coincidirá con toda la cadena.
finefoot
Línea2 "pero sin coincidir a menos que sea absolutamente necesario": ¿Qué significa esto?
Lloviendo
70

El operador no expansivo, ?. Al igual que:

.*?
David Hedlund
fuente
45

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

Jonathan
fuente
2
O busque en orden inverso, comenzando por el final, cuando las coincidencias estén anidadas: "(ab (abk) bk)".
LBogaardt
7
@LBogaardt ¿cómo se buscaría en orden inverso? no lo entiendo
azerafati
2
@LBogaardt Pregunta todavía abierta: ¿Cómo se buscaría en orden inverso? Digamos que quiero conseguir cab. Si mi entrada es caaacaby 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?
C4d
3
Invierta la cadena, luego aplique la expresión regular.
Jonathan Allen
3
Esto es muy útil. Para las personas como yo que intentan entender lo que está sucediendo aquí, la forma genérica es 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"
derekantrican