• Publicidad

Expresión regular para IP

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Expresión regular para IP

Notapor angelruiz » 2009-08-10 17:50 @785

Hola.

He estado intentando hacer lo siguiente:

Tengo una IP: (192.168.40.2)

Y con una expresión regular quiero obtener (192.168.40)

Lo que logré fue extraer los 4 bloques por separado y concatenar lo que me interesaba. Pero es un código muy rebuscado. Sé que no es el correcto.
Cualquier orientación o idea es agradecida.

Saludos.
angelruiz
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2009-06-03 08:33 @398

Publicidad

Re: Expresión regular para IP

Notapor explorer » 2009-08-10 17:54 @788

¿Dónde está el código que has usado?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular para IP

Notapor angelruiz » 2009-08-10 18:06 @796

Disculpa no haberlo mostrado, pero me parece malísimo, jejeje

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $ip = "192.168.50.30";
  2. $ip =~ m{
  3. ^ #inicio de cadena
  4. ([0-9]+)\. #vari1
  5. (.*)\. #vari2
  6. (.*) #vari3
  7. $ #Fin de la cadena
  8. }x;
  9.  
  10. print "primera: $1\n";
  11. print "segunda: $2\n";
  12. print "tercera: $3\n";
  13. my $yy = "$1.$2.0/24\n";
  14. print "$yy"
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Es un código de prueba :oops:
angelruiz
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2009-06-03 08:33 @398

Re: Expresión regular para IP

Notapor explorer » 2009-08-10 19:15 @844

Bueno, se puede hacer de muchas formas, pero tu solución es igual de válida.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $ip = "192.168.50.30";
$ip =~ /^(\d+\.\d+\.\d+)/;
print "$1.0/24\n";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Hay un problema: en el texto dices que quieres obtener los tres primeros valores, pero en el código solo te quedas con los 2 primeros, ya que pones el tercero a 0.

Otra forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $ip = "192.168.50.30";
@ip = split /\./, $ip;
print join(".", @ip[0..2], '.0/24'), "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y otra más, usando sustitución, cambiando lo que queremos (el último byte)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $ip = "192.168.50.30";
$ip =~ s/\d+$/0\/24/;
print "$ip\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular para IP

Notapor angelruiz » 2009-08-11 00:47 @074

Nuevamente mil gracias Explorer.
Mejor no se puede, se nota que colaboras con mucho esmero.

Gracias.
angelruiz
Perlero nuevo
Perlero nuevo
 
Mensajes: 32
Registrado: 2009-06-03 08:33 @398

Re: Expresión regular para IP

Notapor explorer » 2009-08-11 08:40 @403

Se me ha ocurrido otra forma: con las funciones de búsqueda y subcadena:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $ip = "192.168.50.30";

substr($ip, rindex($ip, q[.])) = '.0/24';

print "$ip\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Con rindex() buscamos desde atrás el último '.', y allí insertamos el texto que queremos con substr() usado en el lado izquierdo de la asignación (curioso: una función en el lado izquierdo).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular para IP

Notapor salva » 2009-08-18 07:20 @347

Yo te recomiendo que le eches un vistazo al módulo Regex::Common que contiene expresiones regulares ya preparadas para las cosas más comunes.

La expresión regular correcta para una IP, si quieres ser estricto y que no se te cuelen cosas que no son IP válidas, no es tan sencilla como pudiese parecer a primera vista.

En este caso, la que genera Regexp::Common es...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
/^((25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))$/
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Que además captura la IP en $1 y los octetos que la forman en $2, $3, $4 y $5 respectivamente.

O sea, para lo que tu quieres hacer...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Regexp::Common qw/net/;

my $ip = "192.168.50.30";
if ($ip =~ /^RE{net}{IPv4}{-keep}$/o) {
  print "$2.$3.$4\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-08-18 07:27 @352, editado 1 vez en total
Razón: Ortografía
Avatar de Usuario
salva
Perlero nuevo
Perlero nuevo
 
Mensajes: 200
Registrado: 2008-01-03 15:19 @680


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 28 invitados

cron