feb 08 29

Cómo usar tags en expresiones regulares

Tiempo estimado de lectura: 1,47 minutos

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.

Copame! Digg it Digg it Reddit Del.icio.us

    7 Comentarios

  1. Matías


    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

  2. Mauricio


    Muy bueno, estos son de los tips que te ahorran un rato de reniego…

    Saludos

  3. meneame.net


    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…

  4. Cómo hacer expresiones regulares más eficientes | eleZeta - Lucas Zallio


    [...] 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 [...]

  5. klikopolo


    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.

  6. Jessie Korsen


    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.

  7. Lessie Dosal


    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.

Deja un Comentario

Tags permitidos:

  • <a href="" title="">
  • <abbr title="">
  • <acronym title="">
  • <blockquote cite="">
  • <code>
  • <em>
  • <strong>