Pergunta

Como posso determinar se uma string é um endereço IP?Qualquer IPv4 ou IPv6?

Qual é o menor e maior número de caracteres?

Presumo que isso seria um expressão regular responder.

Foi útil?

Solução

Mas a questão não é tão simples como assumir a.b.c.d ... existem muito mais formas do que você imaginava.

Mas certamente esta é uma pergunta do Google?Bastante todo cartilha regex que você pode encontrar em qualquer lugar usa IP como exemplo! ipv4 + regex marca 183.000 acessos!

Outras dicas

Já fiz isso antes, mas gosto da postagem de Raymond Chen em:

http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx

Onde ele basicamente defende o uso de regexes para aquilo em que são bons:analisando os tokens.Em seguida, avalie os resultados.Seu exemplo:

function isDottedIPv4(s)
{
 var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
 return match != null &&
        match[1] <= 255 && match[2] <= 255 &&
        match[3] <= 255 && match[4] <= 255;
}

É muito mais fácil olhar para isso e entender o que deveria estar fazendo.

No .NET existe um tipo IPAddress que possui um método útil TryParse.

Exemplo:

if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
    //validatedIPAddress is good
}

// or more simply:
bool IsValidIPAddress(string possibleIP){
    return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}

Para IPv4 você pode usar esta expressão regular.

\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Parece bastante complexo, mas funciona limitando cada quadrante aos números de 0 a 255.

@não fatiado:é verdade, esse problema pode ficar um pouco louco.

Se você realmente precisa lidar com qualquer endereço IP possível, terá que criar algo mais sofisticado.

No entanto, se você deseja apenas fazer uma validação básica para garantir que os usuários estão inserindo dados formatados corretamente, acho justo restringi-los ao modelo a.b.c.d com as expressões regulares acima.

@unsliced ​​isso está correto, mas é claro que dependerá da implementação. Se você estiver analisando um IP de um usuário que visita seu site, você pode usar regex, pois DEVE estar no formato x.x.x.x.

Para IPv6 você poderia usar isso

[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}

porém não pega tudo porque com IPv6 é muito mais complicado, de acordo com a wikipedia todos os exemplos a seguir estão tecnicamente corretos porém o regex acima só pegará aqueles com *

2001:0db8:0000:0000:0000:0000:1428:57ab*
2001:0db8:0000:0000:0000::1428:57ab*
2001:0db8:0:0:0:0:1428:57ab*
2001:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab

Como metade disso Regex lida com o fato de que o último segmento não tem um período no final, você pode cortá -lo ao meio se prender a ''. até o final do seu possível endereço IP.

Algo assim:

bool IsValidIPAddress(string possibleIP){
  CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
  return Regex.Match(possibleIP+'.', CrazyRegex)
}

IPv4 se torna: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

Não tenho certeza sobre as regras do IPv6.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top