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
[Resolvido]Expressões Regulares para validar de IP
8 Respostas
Expremente tirar o *
Cara … isso com certeza com alguns minutos no google vc vai encontrar pronto. Sugiro um site chamado RegLib
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!
Olá, 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!
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
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}
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;
}
Olá…
Agradeço a ajuda de todos, eu consegui fazer como o jtsato sugeriu e acabei programando na unha mesmo
, 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!