Domanda

Come posso determinare se una stringa è un indirizzo IP?Sia IPv4 o IPv6?

Che cosa è il minimo e il maggior numero di caratteri?

Presumo che questo sarebbe un regex risposta.

È stato utile?

Soluzione

Ma la questione non è così semplice come ipotizzando a.b.c.d ... ci sono il modo più moduli di quanto realizzato.

Ma sicuramente questo è un Google domanda?Praticamente ogni regex primer che si possono trovare ovunque utilizza IP come esempio! ipv4 + regex punteggi 183,000 hits!

Altri suggerimenti

Ho fatto questo prima, ma mi piace Raymond Chen post a:

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

Dove ha fondamentalmente incoraggia l'utilizzo di espressioni regolari per quello che stanno bene a:l'analisi di gettoni.Poi valutare i risultati.Il suo esempio:

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;
}

È molto più facile guardare e capire ciò che si suppone di fare.

In .NET c'è un Indirizzo ip del tipo che ha un metodo pratico TryParse.

Esempio:

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

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

Per IPv4 è possibile utilizzare questa espressione regolare.

\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

Sembra abbastanza complesso ma funziona limitando ogni quad per i numeri da 0 a 255.

@unsliced:vero, questo problema può ottenere un po ' pazzo.

Se si ha realmente bisogno per gestire i possibili indirizzo IP, quindi dovrete mettere insieme qualcosa di più sofisticato.

Tuttavia, se si desidera eseguire la convalida di base per assicurarsi che gli utenti stanno inserendo correttamente i dati formattati, penso che sia giusto limitare l'una.b.c.modello d con sopra le espressioni regolari.

@unsliced che è corretto però non dipenderà, ovviamente, l'attuazione, se l'analisi di un IP da un utente che visita il tuo sito, i tuoi sono ottimi per l'utilizzo di espressioni regolari, come DOVREBBE essere in x.x.x.x formato.

Per IPv6 è possibile utilizzare questo

[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}

tuttavia, non prendere il tutto, perché con IPv6 è molto più complicato, secondo wikipedia tutti gli esempi seguenti sono technicaly corretto però la regex sopra solo prendere quelli con un *

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

Dal momento che la metà di quella regex gestisce il fatto che l'ultimo segmento non ha un periodo alla fine, si poteva tagliare a metà, se virare un '.' per la fine della sua eventuale indirizzo IP.

Qualcosa di simile a questo:

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 diventa: /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

Io non sono sicuro circa l'IPv6 regole.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top