Cómo usar tags en expresiones regulares
Ya hemos hablado acerca del poder de las expresiones regulares en la programación. Sin embargo, extraer información de una cadena con expresiones regulares puede ser un tanto complicado a la hora de navegar por los Ãndices del array generado.
Para solucionar este problema, varios lenguajes implementaron los tags en las expresiones regulares. Estos tags permiten al desarrollador organizar el array de salida en una cadena de coincidencias.
Para ejemplificar este mini tutorial, utilizaré la función preg_match_all() de php, ya que es la que mayormente uso en este tipo de casos. Los que usan python por ejemplo, podrán usar la misma expresión en la función re.findall().
Manos a la obra
Imaginemos por un momento que queremos obtener diferente información de una url y queremos extraer por un lado el protocolo, por otro lado ver si tiene las www, por otro el dominio propiamente dicho y por el otro lado el request.
Si usáramos una expresión regular común, con preg_match_all() que busca todas las coincidencias posibles y las guarda en un array indexado, se nos harÃa difÃcil calcular antes de ver el array en que posición está la información que necesitamos.
Por ejemplo:
preg_match_all ('/(.+://)(www.)?([^/]+)(.*)/', 'http://www.google.com.ar/search?q=elezeta', $array);
Nos dará como resultado un engorroso $array que estará compuesto por varios Ãndices en donde cada uno de esos Ãndices son las coincidencias que la función detectó y para utilizar esta información, tenemos primero que ver como es el array y después llamar al Ãndice que nos interesa.
En cambio, usando los tags, podemos decirle que además de crear el array indexado, nos agregue Ãndices asociativos con los tags de nuestra información.
El mismo ejemplo con tags:
preg_match_all ('/(?P<protocolo>.+://)(?P<w>www.)?(?P<dominio>[^/]+)(?P<query>.*)/', 'http://www.google.com.ar/search?q=elezeta', $array);
De esta forma sabemos que:
$array['protocolo']: va a tener el protocolo "http://".
$array['w']: va a tener si usa www "www", si no usa, va a ser nulo.
$array['dominio']: va a tener el dominio: "google.com.ar".
$array['query']: va a tener todo el resto.
Como verán es muy simple el uso de tags en las expresiones regulares en lenguajes que lo soportan. Tan sólo agreguen ?P<tagname> delante del grupo de coinsidencia y la función se encargará del resto.
Esto surge de una charla que tuvimos con MatÃas acerca de las virtudes de las expresiones regulares en PHP y en Python.










7 Comentarios
MatÃas
febrero 29th, 2008 at 12:48 pm
Excelente post para mostrar lo que son REGEXPs extendidas. En Python también podés hacer después de eso para que matchee exactamente lo que inmediatamente antes se matcheó con el tag que correspondÃa. Está excelente para no tener que hacer post-processing después
Mauricio
febrero 29th, 2008 at 1:55 pm
Muy bueno, estos son de los tips que te ahorran un rato de reniego…
Saludos
meneame.net
marzo 1st, 2008 at 10:18 pm
Cómo usar tags en expresiones regulares…
Extraer información de una cadena con expresiones regulares puede ser un tanto complicado a la hora de navegar por los Ãndices del array generado. Para solucionar este problema, varios lenguajes implementaron los tags en las expresiones regulares. Es…
Cómo hacer expresiones regulares más eficientes | eleZeta - Lucas Zallio
julio 11th, 2008 at 8:21 pm
[...] he hablado sobre las virtudes de las expresiones regulares, también hablé sobre usar tags en las regexps. En este caso voy a dar tres tips para hacer las expresiones regulares más [...]
klikopolo
septiembre 10th, 2011 at 12:47 pm
I really wanted to post a brief message to be able to appreciate you for some of the great guides you are posting here. My time-consuming internet lookup has at the end been compensated with really good knowledge to share with my partners. I ‘d state that that we readers are quite lucky to dwell in a great site with many outstanding professionals with very helpful points. I feel somewhat privileged to have discovered your web pages and look forward to tons of more exciting moments reading here. Thank you again for a lot of things.
Jessie Korsen
septiembre 11th, 2011 at 12:36 pm
I’m just commenting to let you understand of the useful experience my cousin’s girl went through checking the blog. She discovered numerous issues, with the inclusion of how it is like to possess an amazing teaching heart to have others clearly comprehend specified advanced things. You undoubtedly exceeded visitors’ expected results. I appreciate you for churning out the priceless, safe, explanatory and even easy thoughts on your topic to Evelyn.
Lessie Dosal
septiembre 12th, 2011 at 8:12 am
I precisely necessary to appreciate you once more. I am not certain the items that I might have used without the type of concepts revealed by you regarding this subject matter. It truly was a hard case in my circumstances, nonetheless , finding out the expert strategy you handled that took me to jump more than joy. I’m just pleased for this assistance and then hope which you really know what an amazing job you might be carrying out educating the rest with the aid of your webpage. I’m confident you’ve got never come across any of us.