Perl significa Lenguaje Práctico de Extracción e Informes y este es un acrónimo no autorizado. Una de las características más poderosas del lenguaje de programación Perl es la expresión regular y en este artículo aprenderá cómo extraer una dirección IP de una string. Una expresión regular puede ser simple o compleja, según el patrón que desee hacer coincidir, como nuestro título: Extracción de la dirección IP de una string mediante Regex. Extraer la dirección IP de una string puede ser una tarea simple o desafiante. Por lo tanto, la gente ama y odia las expresiones regulares. Son una excelente manera de expresar un patrón simple y una manera horrible de expresar patrones complicados. Algunos de los ejemplos de Cuantificadores, así como Caracteres y su significado se dan a continuación:
cuantificador | Sentido |
---|---|
a* | cero o más a |
un+ | una o más a |
¿a? | cero o una a |
soy} | exactamente ma’s |
soy,} | al menos ma’s |
un {m, n} | al menos m pero como máximo n a’s |
Personaje | Sentido |
---|---|
^ | principio de string |
ps | final de string |
. | cualquier carácter excepto nueva línea |
* | coincidir 0 o más veces |
+ | coincidir 1 o más veces |
? | coincidir 0 o 1 veces |
| | alternativa |
( ) | agrupamiento |
[ ] | juego de caracteres |
{ } | modificador de repetición |
\ | cotización o especial |
Extraer una dirección IP de una string
La forma más fácil es simplemente tomar cualquier string de cuatro números decimales separados por puntos es
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/ OR /^\d+\.\d+\.\d+\.\d+$/
En el siguiente ejemplo, simplemente extraemos una dirección IP de una string dada.
#!/usr/bin/perl my $ip = "MY IP ADDRESS IS172.26.39.41THIS IS A VALID IP ADDRESS"; if($ip =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { $ip = $1; print "$ip\n"; }
Producción:
Pero, el ejemplo anterior también acepta la dirección IP incorrecta como 596.368.258.269. Sabemos que una dirección IP adecuada con puntos decimales no tiene un valor superior a 255 y escribir una expresión regular que coincida con los números enteros de 0 a 255 es un trabajo duro ya que las expresiones regulares no entienden la aritmética; operan puramente textualmente. Por lo tanto, debe describir los números enteros del 0 al 255 de forma puramente textual.
Ahora, veremos una implementación de extracción de una dirección IP que también verificará el rango de octetos.
#!/usr/bin/perl my $ip = "MY IP ADDRESS IS 36.59.63 THIS IS A VALID IP ADDRESS"; if($ip =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { if($1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255) { print("Each octet of an IP address ", "is within the range - $1\n"); print("\nIP address accepted!\n"); } else { print("Octet not in range - $1\n", "IP address not accepted\n"); } } else { print("Valid IP address not found in a given string\n"); }
Producción:
Si cambia la string a
[my $ip = "MY IP ADDRESS IS 127.36.59.63 THIS IS A VALID IP ADDRESS";]
entonces la salida es
En el siguiente ejemplo, aceptamos una string del usuario que contiene una dirección IP y luego extraemos la dirección IP de ella. Usamos la función chomp() para eliminar cualquier carácter de nueva línea del final de una string.
#!/usr/bin/perl print("Enter the IP Address you would like to validate - "); my $ip = <STDIN>; if($ip =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) { $ip = $1; } chomp($ip); if($ip =~ m/^(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)\.(\d\d?\d?)$/) { print("\nIP address found - $ip\n"); if($1 <= 255 && $2 <= 255 && $3 <= 255 && $4 <= 255) { print("Each octet of an IP address is ", "within the range - $1.$2.$3.$4\n"); print("\n-> $ip IP address accepted!\n"); } else { print("Octet(s) out of range. ", "Valid number range between 0-255\n"); } } else { print("IP Address $ip is not in a valid format\n"); }
Producción: