[Resolvido]Expressões Regulares para validar de IP

8 respostas
BrunoLaser

Olá…
Estou tentando fazer uma expressão para validação de IP e estou tendo alguma dificuldade, alguém poderia me dar uma ajuda? Segue abaixo o código que estava tentando fazer

8 Respostas

luistiagos

Expremente tirar o *

marciobarroso

Cara … isso com certeza com alguns minutos no google vc vai encontrar pronto. Sugiro um site chamado RegLib

M

Existe um livro de bolso do Aurélio que está disponível totalmente livre na web: http://guia-er.sourceforge.net. A nova versão é muito boa, mas com esta você pode achar muitas outras coisas que precisa. E o melhor, conceitos valiosos.

Sucesso!

Mantu

Olá, BrunoLaser!

BrunoLaser:

if(jTextField2.getText().matches("[1-255]*[.][0-255]*[.][0-255]*[.][0-255]*")){ System.out.printf("IP VÁLIDO!!!"); }

Recomento que você dê uma lida na documentação da classe java.util.regex.Pattern, onde você encontrará uma tabela detalhada com os caracteres especiais e seus respectivos significados para uso em expressões regulares:
http://java.sun.com/javase/6/docs/api/index.html
Quanto ao seu caso, o primeiro problema que salta aos olhos é a utilização de forma errada do [b]grupo de caracteres/b. Pelo nome já temos uma dica sobre qual foi o erro cometido: grupo de caracteres. Dentro de uma regex Java, o termo [1-255] não quer dizer do 1 até o 255, e sim do 1 até o dois, ou 5, ou 5. Expressões regulares não são capazes de “julgar” o valor de um trecho do texto, ou seja, não consegue saber se um pedaço do texto vale 1, 2, 255, 28474, -3473.585, etc… Uma solução para o seu caso pode utilizar regex, mas precisará de algum processamento a mais.
Outro problema é o que o caractere especial “*” representa um quantificador que conta 0 ou mais vezes. Dessa forma, seu regex permitiria um “ip fantasma”, tipo assim: “…”!!! Isso mesmo! Só tem os pontos, pois sua regex permite que a parte dos números possam aparecer várias vezes ou simplesmente não apareçam. Outra possibilidade dada pela sua regex seria um ip mais ou menos assim: "112255252515251…2212222211551.1 :shock:
Uma regex útil para você seria a seguinte:

String ipRegex = "\d{1,3}(\.\d{1,3}){3}";

essa regex vai casar com qualquer string que siga um padrão assim: 1 a 3 dígitos, seguidos de um ponto, seguido de 1 a 3 dígitos, seguidos de um ponto, seguido de 1 a 3 dígitos, seguidos de um ponto, seguido de 1 a 3 dígitos.
Mas veja: A regex vai te garantir apenas isso, sem fazer julgamento do valor dos números que estão ali. Essa regex, por exemplo, permitiria um ip assim: 355.985.5.999.
Agora, é você quem vai ter que, programaticamente, validar os valores de cada termo do ip. Você pode utilizar, por exemplo, o método split da classe String para quebrar o ip e analisar cada membro. Tente e poste mais caso surjam novas dúvidas.
Sobre o método split: http://java.sun.com/javase/6/docs/api/java/lang/String.html#split(java.lang.String)

Divirta-se!

T

Se puder, em vez de expressões regulares, tente converter (InetAddress.getByName()) e ver se dá algum problema (ok, se você usar essa rotina, demora um pouco porque pode ser que faça uma consulta ao DNS).
É que vocês se esqueceram do IPv6 (http://java.sun.com/j2se/1.5.0/docs/api/java/net/Inet6Address.html ) , onde a sintaxe é mais complicada ainda. Exemplos:

1080:0:0:0:8:800:200C:417A
1080::8:800:200C:417A
::FFFF:129.144.52.38
::129.144.52.38

mavcunha

Como mencionado, não tente bolar uma expressão regular para parsear IPs, carrego essa experiência da linguagem Perl.

Em Perl há uma discussão neste site:
http://www.perlmonks.org/?node_id=221512

Portanto a alternativa de utilizar InetAddress.getByName() pode ser uma boa como o thingol mencionou.

Agora em último caso a expressão regular que eu conheço é esta:

(1?\d\d?|2[0-4]\d|25[0-5])(.(1?\d\d?|2[0-4]\d|25[0-5])){3}

jtsato

As vezes você não pode usar o InetAddress e tem que validar na unha.

public static boolean verificarIPValido(String ip) { if (ip == null) { return false; } if (ip.trim().equals("")) { return false; } if (ip.indexOf("-") >= 0) { return false; } String[] strPartes = ip.replace('.', '-').split("-"); if (strPartes.length != intPartes) { return false; } for (int i = 0; i < strPartes.length; i++) { String strPedaco = strPartes[i]; if (strPedaco == null) { return false; } if (strPedaco.trim().equals("")) { return false; } try { int intPedaco = Integer.parseInt(strPedaco); if ((intPedaco == 0) || (intPedaco >= 254)) { return false; } } catch (NumberFormatException e) { return false; } } return true; }

BrunoLaser

Olá…

Agradeço a ajuda de todos, eu consegui fazer como o jtsato sugeriu e acabei programando na unha mesmo :slight_smile: , vou até adicionar à favoritos este post pois as ajudas postadas aqui podem e tenho certeza que vão me ajudar em outros momentos ate mais!

Criado 6 de junho de 2007
Ultima resposta 15 de jun. de 2007
Respostas 8
Participantes 8