[Perl] Expresiones regulares y cuantificadores no codiciosos

Hace poco tiempo tuve problemas con una regex que no tomaba lo que, al parecer, yo le indicaba. El problema no es grave, pero tiene que ver sobre como Perl trata las expresiones regulares y las wildcards.

Por ejemplo, si tenes el siguiente string “See spot, see spot run, run spot run” y tratamos de capturar lo que se encuentra antes del primer ‘spot’ podríamos querer hacer algo como esto:

Lo cual nos mostraría en pantalla ‘See spot, See spot run, run ‘. En vez del primer ‘See ‘ que ya cumpliría con lo que dice nuestra regex. El tema está en que Perl, tratara de matchear lo más que pueda ya que hace uso de cuantificadores codiciosos (greedy quantifiers). De modo que para traer el primer ‘See ‘ debemos hacer uso de los ‘cuantificadores no codiciosos’ (non-greedy quantifiers), En este caso ‘*?’  que tratara de matchear 0 o más lo menos que pueda. Es decir, cambiando a:

Obtendremos el primer ‘See ‘.

Del mismo modo, asì como con el cuantificador codicioso ‘+’ matchearemos 1 o 0 veces, con ‘+?’ matchearemos 0 o 1 veces (primero 0, luego una). y usando el cuantificador no codicioso  {x,y}? podremos matchear x veces, pero no màs de y.

Conclusión, un problema bastante sencillo pero que puede generar algunas confusiones.

Fuente:  http://perldoc.perl.org/perlretut.html