comodines-y-expresiones-regulares

Hasta el momento todos los ejemplos que has ido viendo a lo largo de los diferentes capítulos de este tutorial, hacían referencia a la ejecución de una herramienta sobre un único archivo. Sin embargo, esto es lo menos productivo que puedes hacer. Siempre estoy llamando tu atención sobre la productividad en el terminal, y hasta ahora no has tenido la oportunidad de aprovecharlo. Ahora, que ya sabes manejarte en el terminal, reconoces archivos y directorios, los permisos, e incluso sabes crearlos y modificalos, es el momento de trabajar con mas de un archivo y directorio a la vez, es el momento de conocer los comodines y las expresiones regulares.

¿Que son los comodines y expresiones regulares?

Los comodines y expresiones regulares son patrones de búsqueda. Un patrón es una secuencia de caracteres que nos permite seleccionar palabras, frases o secuencias de caracteres.

Así, por ejemplo, un patrón, te puede ser de utilidad para seleccionar todos aquellos archivos de un directorio, que comiencen por una determinada letra o secuencia de letras. Sin embargo, esto no es mas que la punta del iceberg, porque los comodines y expresiones regulares nos abren un abanico de posibilidades extraordinario.

Sobre los comodines

Primero que quiero que te acostumbres al uso de los comodines, aunque probablemente ya los conoces de sobra. Seguro que los has utilizado en mas de una ocasión. Como te he comentado anteriormente, los comodines se suelen utilizar para realizar operaciones sobre varios archivos. Seguro que en mas de una ocasión, has visto has utilizado ls *. Este sencillo comando nos permite listar todos los archivos que se encuentran en el directorio, en el que hemos ejecutado esta instrucción. Los comodines se pueden utilizar con prácticamente cualquier otro comando, mv, cp, rm y muchos otros.

A continuación puedes ver un listado de los comodines mas utilizados,

  • ?. Representa un único carácter. Así por si ejecutas ls /dev/sda? te listará todos los archivos que sean igual a /dev/sda mas un único caracter, que puede ser cualquier letra o número. Así en mi caso, ha listado mis unidades, de la /dev/sda1 a la /dev/sda7.
  • *. Este comodín representa desde nada, hasta cualquier cantidad de caracteres y dígitos. Así, en el ejemplo que he indicado anteriormente, si ejecutados ls /dev/sd* te listará /dev/sda, /dev/sda1 a /dev/sda7 y si tienes otra unidad, /dev/sdb, /dev/sdb1,…
  • []. En este caso, este comodín representa un rango, ya sea de caracteres o de números. Siguiendo con el ejemplo anterior, podemos listar ls /dev/sda[1-5]. Ya te puedes hacer una idea de lo que va a listar.
  • {}. Esto en realidad es mas un conjunto de comodines separados por comas. Igual que en casos anteriores, podrías ejecutar la siguiente orden ls {sda*,sdb*}. Ojo con dejar espacios alrededor de la coma, por que te dará un error.
  • [!]. El funcionamiento de este comodín es similar a [], salvo que representa justo lo contrario. Es decir se trata de listar todo aquello que que no esté en ese rango. Por ejemplo, ls /dev/sda[!1-5] te mostrará /dev/sda6 y /dev/sda7. Como te imaginas, esto es en mi caso, en tu equipo seguramente el resultado será otro.
  • \. Esta es la secuencia de escape y que tienes que tener siempre muy presente. Con este carácter puedes mostrar otros caracteres. Así, si quieres crear el directorio esta casa y ejecutas mkdir esta casa, te creará dos directorios, esta y casa. Para hacer lo que quieres, tienes diferentes alternativas, o bien mkdir "esta casa" o bien mkdir esta\ casa. En esta segunda orden utilizamos \ para escapar el carácter espacio. Esto ya te lo comenté en el artículo anterior sobre gestionar archivos.

Expresiones regulares

Las expresiones regulares tienen un potencial increible, pero a diferencia de los comodines necesitan una mayor esfuerzo por tu parte. Por una lado necesitan de una curva de aprendizaje mas o menos pronunciada, y por otro lado, su aplicación no es tan intuitiva como en el caso de los comodines.

A continuación encontrarás algunos de los elementos con los que construir expresiones regulares. Sin embargo, al contrario que con los comodines, dejaré los ejemplos para el final.

  • .. Representa un solo carácter, es el equivalente a la ? de los comodines.
  • \. Se utiliza para escapar caracteres, al igual que en el caso de los comodines.
  • +. El elemento precedente puede aparecer 1 o mas veces.
  • *. Es similar al anterior, pero en este caso, el elemento puede aparecer cero o mas veces.
  • ^ ó \A. Dependiendo de su ubicación tiene un significado u otro. Así si lo encuentras al principio se corresponde con que lo que buscamos debe comenzar igual. Si lo encontramos entre corchetes es una negación, como veremos mas adelante.
  • $ ó \Z. Es el opuesto al anterior, en tanto en cuanto, cuando lo encuentras al final indica que lo que buscamos tiene que acabar igual.
  • []. Especifica un rango, ya sea separado por comas como [a,b,c] o bien [a-c].
  • |. Representa un o lógico.
  • [^]. Como he indicado anteriormente, esta expresión se utiliza para negar rangos.
  • {}. Indica el número de repeticiones del caracter precedente. Así a{3} es equivalente a aaa. Pero además a{3,} representa 3 ó mas a. En el caso de a{1,5} se refiere a entre 1 y 5.

Además de estas que son muy parecidas a los comodines, en el caso de las expresiones regulares tenemos mas, como son las siguientes,

  • \s. Se corresponde con un espacion en blanco.
  • \S. El contrario del anterior, es decir, cualquier carácter que no sea un espacio en blanco.
  • \d. Equivale a un dígito.
  • \D. Cualquier carácter que no sea un dígito.
  • \w. Se corresponde a cualquier carácter que se pueda utilizar en una palabra. Es equivalente a [a-zA-Z0-9_].
  • \W. El opuesto al anterior, es decir, es equivalente a [^a-zA-Z0-9_].

Por supuesto, también tiene en cuenta los caracteres escapados, que comenté anteriormente, y entre los que cabe citar,

  • \n. Se corresponde con una línea nueva.
  • \r. Para retorno de carro.
  • \t. Representa una tabulación.
  • \0. Se utiliza para un carácter nulo

Por último queda el rey que es () cuyo objetivo es el de capturar todo lo que está en su interior.

Algunas expresiones regulares útiles

Indicarte antes de comentarte sobre estos ejemplos de expresiones regulares que, normalmente van delimitados por //. Es decir, la expresión regular viene a ser /expresión-regular/.

  • Caracteres alfabéticos. /^[a-zA-Z]*$/. Estos patrones son los mas sencllos de utilizar, sin embargo es un buen comienzo.
  • Caracteres en minúsculas. /^([a-z]*$ Igual que en el caso anterior, pero esta vez en minúculas.
  • Números. /^[0-9]*$/. La tercera opción pero solo para dígitos. Sin embargo, a partir de ahora, la cosa se va a ir complicando.
  • Nombre de usuario. /^[a-z0-9_-]{3,16}$/. En este caso, el nombre de usuario debe tener una longitud mínima de tres caracteres y máxima de 16. Solo puede estar compuesto por letras minúsculas, números, además de _ y -. Podrías incluir también las mayúsculas de la siguiente forma, /^[a-zA-Z0-9_-]{3,16}$/.
  • Contraseña. Esto es muy similar al anterior, pero, por un lado podemos considerar cambiar la longitud mínima y máxima de la contraseña, y por otro lado incluir algunos otros caracteres. Así podría ser algo como [a-zA-Z0-9_-$!¡@?¿=;:]{8,20}$/. Hemos aumentado la longitud mínima a 8 y la máxima a 20 y además hemos incorporado algunos caracteres mas o menos extraños como pueden ser$!¡@?¿=;:.
  • Correo electrónico. Este patrón ya tiene un poco mas d e dificultad. /^([a-z0-9_\.-]+)@([a-z0-9_\.-])\.([a-z\.]{2,6})$/. Se divide en tres grupos diferenciados, tipo Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.. Los dos primeros admiten letras, números, además de _, - y .. Mientras que el último solo admite letras y el ., pero además con una longitud mínima de 2 y máxima de 6.
  • Dirección web. Otro patrón realmente interesante, /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
  • Código postal. [0-9]{5}(\-?[0-9]{4})?$
  • Para direcciones IP. Prepárate, que este es un buen chorizo /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$. Con esto nos aseguramos que cada uno de los grupos es número comprendido entre 0 y 255.
  • Etiquetas html. Esta es muy interesante y seguro que la utilizarás en mas de una ocasión. Se trata de un patrón para etiquetas html. /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
  • Tarjetas de crédito. Como ves las cosas se van complicando, pero las posibilidades son realmente espectaculares. Puedes hacer casi cualquier cosa que te puedas imaginar, tan solo es cuestión de estudiarlo con el suficiente detalle. /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|622((12[6-9]|1[3-9][0-9])|([2-8][0-9][0-9])|(9(([0-1][0-9])|(2[0-5]))))[0-9]{10}|64[4-9][0-9]{13}|65[0-9]{14}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})*$/.
  • Fechas. Al fin y al cabo, se pueden establecer expresiones regulares que nos ayuden en todas nuestras taresm y simjplifiquen el trabajo. '#^((19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01]))*$#
  • Imágenes. /[^\s]+(?=\.(jpg|gif|png))\.\2)

Servicios online de expresiones regulares

Una herramienta que no puede faltar cuando trabajo con expresiones regulares es algún servicio online que me permita probar las expresiones regulares. Durante confección de una expresión regular, es mas que fácil que te equivoques en algún carácter. En este sentido, es muy recomendable recurrir a estos servicios, que te van a ayudar notablemente a conseguir tu expresión regular perfecta. A continuación puedes encontrar algunos de ellos. Decirte que mi preferido es el primero de ellos,

Además, si estás interesado en aprender mas sobre expresiones regulares te recomiendo RegexOne. En esta página puedes aprender de forma sencilla mediante ejercicios interactivos.

 

Más información:

Fuente: atareao

¿Quién está en línea?

Hay 19976 invitados y ningún miembro en línea