Ver el Tema

 Imprimir Tema
mIRC Scripting Language [Parte cuatro: Regex]
SykO
Hola lector, hace mucho que ya no escribo. Hoy despues de una charla con Mauropek en IRC-Hispano en el canal #eScripting. Desidi escribir esto. Este es un tema que alguien pidio en un video de los video tutoriales que hice. Para ser honesto, yo creia que no valdria la pena, puesto que cada vez menos y menos personas les interasa el mSL, pero bueno lo bueno de este tema es importante para pogramacion en general. Actualmente lo estoy usando para crear pequeños shell programas para linux.

Bueno para iniciar definamos que es regex. Regex es corto para Regular Expressions (expressiones regulares). Estas expreciones son utilizadas para encontrar patrones en alguna linea de texto. Ejemplo (1), supongamos que tenemos un archivo con la siguiente lista:

Kedyn M 012-345-6789 micorreo@midominio.com
Nydek 987-654-3210 micorreo@midominio.org
Denyk 102-345-6789 micorreo@midominio.edu
Nedyk E 201-635-4789 micorreo@midominio.net
.....

supongamos que quieres obtener todos los numeros telefonicos, como podemos ver estan compuesto con el siguiente patron: tres digitos seguidos por un simbolo de menos otros tres digitos, otro simbolo de menos y terminan con cuatro digitos mas, sin espacio entre los digitos y los simbolos de menos. Como mencione anteriormente hemos encontrado un patron, desde hoy al ver patrones puedes pensar regex.

Por ahora olvidemos nuestro ejemplo (1), primero es bueno aclarar que quizas no todo lo que se muestre en este "tutorial" coincidira con mSL u otro lenguage puesto que yo ahorita estoy programando en bash shell. Dicho esto, comensemos. En regex existen caracteres especiales los cuales se les llama metacaracteres, los cuales tienen ciertas funciones. No voy a cubrir todos, pero si algunos basicos y que quizas sean los mas importantes.

(Nota: los siguientes ejemplos tiene el siguiente formato: "nuestro texto donde se encuntra el patron que queremos comparar con nuestro regex" "nuestro regex" "si o no, dependiendo si el patron es encontrado")

Descargar código fuente.  Código.

Metacaracter:      Descripcion/ejemplos:
?               coincide 0 o mas de caractere previos a ?
                  "abc"      "a?bc"   si
                  "bc"       "a?bc"   si
                  "ac"       "a?bc"   no
                  "ebc"      "a?bc"   si
                     nota: quizas te preguntes como es que la ultima si coincide? bueno esto es por que a es opcional, recuerda ? coincide 0 o mas caracteres previos a este, por ahora solo lee que hace cada metacaracter

.               coincide cualquier caracter
                  "abc"      "a.c"      si
                  "ac"       "a.c"      no
                  "adc"      "a.c"      si

*               coincide zero o mas del caracter anterior a *
                  "abc"    "a*bc"   si
                  "aabc"   "a*bc"   si
                  "bbc"    "a*bc"   si
                  "bc"     "a*bc"   si
                  "ac"     "a*bc"   no

+               coincide uno o mas del caractere anterior a +
                  "abc"    "a+bc"   si
                  "aabc"   "a+bc"   si
                  "bbc"    "a+bc"   no
                  "bc"     "a+bc"   no
                  "ac"     "a+bc"   no

{m,n}            coincide mas o igual a m y menos o igual a n el caracter anterior a {m,n} y ,n es opcional
                  "abc"    "a{1,2}bc"   si
                  "aabc"   "a{1,2}bc"   si
                  "bc"     "a{1,2}bc"   no

[]               coincide cualquier caracter dentro de los corchetes
                  "hola"      "[bh]ola"   si
                  "bola"      "[bh]ola"   si
                  "cola"      "[bh]ola"   no

[^]               coincide cualquier otro caracter que no se encuentre dentro de los corchetes despues del ^
                  "hola"      "[^bh]ola"   no
                  "bola"      "[^bh]ola"   no
                  "cola"      "[^bh]ola"   si
^               coincide cualquier cadena que comienze con el caracter despues de ^
                  "hola como estas"        "^hola"   si
                  "buenas como estas?"     "^hola"   no
                  "hey, hola como estas"   "^hola"   no
                     nota: al contrario de los patrones anteriores, este restringe la posicion de el patron

$               coincide cualquier cadena que termine con el caracter anterior de $
                  "hola como estas"        "estas$"   si
                  "buenas como estas?"     "estas$"   no
                  "hey, hola como estas"   "estas$"   si

\               elimina el significado de un caracter especial
                  "pregunta?"   "pregunta\?"   si
                     nota: recuarda que el ? es un caracter especial, con \? indica que es un "?" literal y no un caracter especial

()               coincide un gropo
                  "hola como estas"   "hola( como)? estas"   si
                  "hola estas"        "hola( como)? estas"   si
                     nota: recuerda que el espacio es un caracter, es por eso que esta incluido en el grupo puesto que de lo contrario necesitarias dos espacios despues de hola para que la cadena coincida con el patron

(|)               coincide alguno de los grupos dentro de "()" separados por "|"
                  "hola como estas"   "hola (como estas|que tal)"   si
                  "hola que tal"      "hola (como estas|que tal)"   si

[C-F]               coincide cual quier caracter dentro del rango C y F
                  "ag"     "[a-g]"   si
                  "hz"      "[a-g]"   no
                     nota: puedes usar [a-z] [A-Z] [0-9] y combinar [a-zA-Z0-9]

En algunos motores de regex existen "alias" de classes de caracteres por ejemplo:
\d   digito
\D   no digito
\w   palabra (aphanumerico y guión bajo)
\W   no palabra
\s   espacio en blanco (espacio, pestañas, nueva linea....)
\S   no espacio en blanco





bueno ahora regresemos a nuestro ejemplo (1): supongamos que nunca hemos visto el formato es decir no sabemos que el formato de cada linea, pero sabemos que existe un numero telefonico y es lo que queremos extraer de las lineas.

primero podemos ver que comienza con 3 numeros entonces tenemos "[0-9][0-9][0-9]" igual podriamos hacer "[0-9]{3}"
depues sigue un simbolo de menos, entonces tendriamos "[0-9]{3}-"
despues lo siguen otros 3 numeros y otro simbolo de menos asi que es lo mismo repetido dos veces: "[0-9]{3}-[0-9]{3}-"
y para terminar tenemos 4 numeros entonces tendriamos "[0-9]{3}-[0-9]{3}-[0-9]{4}" o "([0-9]{3}-){2}[0-9]{4}"

regex101.com

es la pagina que yo utilizo para probar mis patrones, he aqui una imagen:
[img]http://syko.wormzweb.com/images/regex.png[/img] is not a valid Image.


Bueno, por ahora dejare esto asi, esperando que les ayude en algo. Intentare hacer revisiones y agregar mas poco a poco cuando me encuentre aburrido y claro si cada dia mas gente decide registrarse a este foro (www.escripting.net) y participar (asi sea uno que muestre interes en el tema).

Nota: no soy experto en regex, pero sabiendo lo basico puedes crear grandes cosas.

Espero les valla bien,


- Kedyn Macedonio
Editado por SykO el 30-01-2018 02:19
Todo lo que se pierde se puede volver a encontrar, menos el tiempo perdido!
 
http://syko.wormzweb.com/
FsDk
esto ya, parece otra cosa jeje muchas gracias syko!
 
Saltar al Foro:
EScripting.NET #eScripting, ChatHispano utiliza cookies. Las cookies nos permiten ofrecer nuestros servicios. Más información. Por favor, haga clic en el botón Aceptar para ocultar esta barra y aceptar nuestras cookies. Si usted continúa utilizando Nuestro sitio sin realizar ninguna acción, vamos a suponer que usted consiente nuestras cookies de todos modos.
Cookiebar Panel fromVenue

Iniciar Sesión

Nombre de Usuario

Contraseña



¿No eres miembro?
Regístrate aquí.

¿Contraseña olvidada?
Recupera tu contraseña.

Usuarios Conectados

Invitados: 1
Miembros: 0
Total Miembros: 352
Último Miembro: DaNnY

Últimas Visitas:

SykO 1 Semana
aM3 1 Semana
FsDk 2 Semanas
NiGhT 2 Semanas
kn1ght 5 Semanas
AfraN 7 Semanas
Zetup 18 Semanas
slim 50 Semanas
El_tio_la... 65 Semanas
MaCLeoD 71 Semanas

  Ver más usuarios 

Mini Charla

Tienes que logearte para enviar un mensaje.

11-01-2018 09:31
0_o

04-07-2017 22:29
Angry Sad Angry

13-05-2017 00:03
omg saludos a todos!!

21-01-2017 21:03
Shock Grin Shock

07-01-2017 01:25
Angry Sad Angry Cool

Archivo de mensajes