3

Supongamos que tengo la cadena siguiente:

hola23adios23bla

Y quiero extraer el texto que aparece antes del 23 utilizando expresiones regulares, para tener de resultado:

hola23
adios23

Si utilizo la expresión siguiente me coge todo, pues el metacarácter * es avaricioso, voraz o, en inglés, greedy:

.*23

Es decir, me extrae un único resultado: hola23adios23, como se ve en la demo.

¿Cómo puedo hacer para que la expresión regular no sea avariciosa y me devuelve hola23 y adios23? Intenté con .+23 pero devuelve lo mismo, hola23adios23.

fedorqui
  • 15,850
  • 17
  • 58
  • 112
  • He visto que este tema no está recogido en ninguna pregunta específica de forma curada, así que me tomo la libertad de añadir esta pregunta preparada de antemano para que sirva de explicación canónica. Toda sugerencia o comentario será bienvenido. – fedorqui Sep 10 '19 at 15:25

1 Answers1

3

Debes utilizar un cuantificador non-greedy, es decir, no avaricioso ni voraz:

.*?23
  ^

Puedes probarlo en una Demo online.

Al añadir el metacarácter ? conseguimos que la expresión haga coincidir con la menor cantidad posible de caracteres.

En este caso particular, si encuentra "hola23" que coincide, ya se para. De lo contrario, seguiría buscando hasta encontrar el último 23 y devolvería "hola23adios23".

fedorqui
  • 15,850
  • 17
  • 58
  • 112