Hacks para sistemas operativos Unix-like/Usando expresiones regulares
EXPRESIONES REGULARES
editarUna expresión regular es una forma de representar a los lenguajes regulares (finitos o infinitos) y se construye utilizando caracteres del alfabeto sobre el cual se define el lenguaje.
Las expresiones regulares son una poderosa herramienta para manipular textos y datos, con el uso de expresiones regulares usted puede ahorrar tiempo y problemas a manipular documentos, mensajes de correo electrónico (e-mail), archivos de registro, cualquier tipo de información que contenga texto o datos, por ejemplo, las expresiones regulares juegan un papel importante en la construcción de programas que corren sobre Internet (cgi-bin), ya que pueden implicar textos y datos de todo tipo.
Las expresiones regulares no son un programa de computadora pero son incluidas como parte de un programa mas grande, el clásico ejemplo es grep2, una potente utilidad comúnmente utilizada en Unix; Las expresiones regulares pueden ser encontradas en:
Lenguajes de programación (perl, tcl, awk, python, java, ...) Editores (Emacs, vi, Nisus Writer, ... ) Entornos de desarrollo (Delphi, Visual C++, ...)
El origen de las expresiones regulares recae en la teoría de autómatas y la teoría formal de lenguajes (juntos parte de la teoría de las ciencias de la computación). Estos campos estudian modelos de computación (autómata) y formas de describir y clasificar lenguajes formales. En los años 40's Warren McCulloch y Walter Pitts describieron el sistema nervioso describiendo a las neuronas como pequeños y simples autómatas. El matemático Stephen Kleene describió estos modelos usando su propia notación matemática llamada conjuntos regulares. El famoso científico de computación Ken Thompson, uno de los creadores de Unix, implemento esta notación en el editor de texto qed, después en el editor de texto ed y eventualmente en grep. Desde ese tiempo las expresiones regulares han sido ampliamente usadas en Unix y programas tipo Unix como: expr, awk, emacs, vim, lex, perl ...
En la sintaxis básica de regexp para Unix, la mayoría de los caracteres son tratados como literales que solo se cumplen para sí mismos (a se cumple para a, ab, aab, etc; abc se cumple para abc, abcc, abcb, etc).
Las excepciones a esta regla son los llamados meta-caracteres:
- . Cualquier carácter que aparezca una vez.
- [ ] Cualquier carácter que aparezca una vez, que se encuentre entre las llaves. ej. [abc] sirve para a, b, o c, [a-z] sirve para las minúsculas (entiéndase como un rango entre a y z), [abcdq-z] es cumplida por a, b, c, d, q, r, s, t, u, v, w, x, y, z, así como [a-dq-z].
- [^] Cualquier carácter que aparezca una vez, que no esté contenido entre las llaves, ej [^abc] es cumplida por cualquier carácter menos a, b y c, [^a-z] es cumplida por cualquier carácter que no sea minúscula.
- ^ Comienzo de línea, ej ^a todas las cadenas que comiencen por a.
- $ Cumplida por el fin de línea, ej $a todas las cadenas que terminen en a.
- * Una expresión que simbolice un solo carácter seguido de un asterisco es cumplido por 0 o más copias de las expresiones, ej x* se cumple para: xxc xa xxxb xaos.
No hay representación para la unión.
Algunos ejemplos:
- [hc]at: cat y hat.
- [^b]at: 3 caracteres que terminen en at y no comiencen por b.
- ^[hc]at: hat y cat pero solo al comienzo de la línea.
- [hc]at$: hat, cat, pero solo al fin de la línea.
La sintaxis básica de regex para Unix a quedado obsoleta por POSIX (IEEE 1003), un estándar que intento unificar algunos procesos en la familia de sistemas operativos Unix. La extensión hecha por POSIX es similar en sintaxis a la tradicional de Unix con metacaracteres añadidos:
- + Cumplido por el último bloque una o más veces, ej ba+ => ba, baa, baaa
- ? Cumplido por el último bloque cero o una vez
- | La opción (o unión de conjuntos) es cumplida por la expresión antes y después del operador, ej “abc|def” => abc, def
Todos los metacaracteres deben ser precedidos por \ si se desea hacer una búsqueda por ellos.
EXPRESIONES REGULARES EN JAVA
editarGenerar un patrón con una expresión regular
Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches();
Obtener el index inicial de la concurrencia
int pos_ini = m.start();
Obtener el index Final de la concurrencia +1
int pos_fin = m.end();
Obtener la siguiente concurrencia
boolean pos_ini = m.find();
Obtener número de concurrencias
int cuantos = m.groupCount();
Sumario de construcciones de expresiones regulares en java
Constructor Coincide Caracteres
- x El carácter x
- \\ El carácter del backslash
- \0 n El carácter con el valor octal 0 n (0 < = n < = 7)
- \0nn El carácter con el nn octal del valor 0 (0 < = n < = 7)
- \0mnn El carácter con el mnn octal del valor 0 (0 < = m < = 3, 0 < = n < = 7)
- \xhh El carácter con el hh hexadecimal del valor 0x
- \uhhhh El carácter con el hhhh hexadecimal del valor 0x
- \t El carácter de lengüeta ( ' \u0009 ' )
- \n El carácter del newline (avance de línea) ( ' \u000A ' )
- \r El carácter de la vuelta de carro ( ' \u000D ' )
- \f El carácter de salto de página ( ' \u000C ' )
- \a El carácter alerta (bell) ( ' \u0007 ' )
- \e El carácter escape ( ' \u001B ' )
- \c x El carácter de control que corresponde a x
Clases del carácter
- [abc ] a , b , o c (clase simple)
- [ ^abc ] Cualquier carácter exceptuando a , b , o c (negación)
- [ a-zA-Z ] a hasta z o A hasta Z , inclusivo (gama)
- [ a-d[m-p ] ] a hasta d , o m hasta p : [ uno-a-dm-p- p ] (unión)
- [ a-z&&[def ] ] d , e , o f (intersección)
- [ a-z&&[^bc ] ] a hasta z , a excepción de b y de c : [ ad-z ] *(sustracción)
- [ a-z&&[^m-p ] ] a hasta z , y no de m hasta p : [ a-lq- z ] *(sustracción)
Clases predefinidas del carácter
. Cualquier carácter (puede o no puede emparejar los adaptadores de la línea )
- \d Un dígito: [ 0-9 ]
- \D Un no-dígito: [ ^0-9 ]
- \s Un carácter del whitespace: [ \t\n\x0B\f\r ]
- \S Un carácter del non-whitespace: [ ^\s ]
- \w Un carácter de la palabra: [ a-zA-Z_0-9 ]
- \W Un carácter de la no-palabra: [ ^\w ]