Frage

Wie kann ich feststellen, ob es sich bei einer Zeichenfolge um eine IP-Adresse handelt?Entweder IPv4 oder IPv6?

Was ist die kleinste und höchste Zeichenanzahl?

Ich gehe davon aus, dass dies ein wäre Regex Antwort.

War es hilfreich?

Lösung

Aber die Frage ist nicht so einfach wie eine Annahme a.b.c.d ... Es gibt viel mehr Formen, als Sie gedacht haben.

Aber das ist doch sicher eine Google-for-it-Frage?Ja schon jeden Der Regex-Primer, den Sie überall finden können, verwendet IP als Beispiel! IPv4 + Regex erzielt 183.000 Treffer!

Andere Tipps

Ich habe das schon einmal gemacht, aber ich mag den Beitrag von Raymond Chen unter:

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

Wobei er grundsätzlich dafür plädiert, reguläre Ausdrücke für das zu verwenden, was sie gut können:Parsen der Token.Bewerten Sie dann die Ergebnisse.Sein Beispiel:

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

Es ist viel einfacher, sich das anzusehen und zu verstehen, was es tun soll.

In .NET gibt es einen IPAddress-Typ, der über eine praktische Methode verfügt TryParse.

Beispiel:

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

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

Für IPv4 können Sie diesen regulären Ausdruck verwenden.

\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

Es sieht ziemlich komplex aus, aber es funktioniert, indem jedes Quad auf die Zahlen 0-255 beschränkt wird.

@unsliced:Stimmt, dieses Problem kann etwas verrückt werden.

Wenn Sie wirklich mit jeder möglichen IP-Adresse umgehen müssen, müssen Sie etwas Anspruchsvolleres zusammenstellen.

Wenn Sie jedoch nur eine grundlegende Validierung durchführen möchten, um sicherzustellen, dass Benutzer ordnungsgemäß formatierte Daten eingeben, ist es meiner Meinung nach angemessen, sie auf das a.b.c.d-Modell mit den oben genannten regulären Ausdrücken zu beschränken.

@unsliced, das ist richtig, aber es hängt natürlich von der Implementierung ab. Wenn Sie eine IP von einem Benutzer analysieren, der Ihre Website besucht, können Sie Regex verwenden, da es im Format x.x.x.x vorliegen sollte.

Für IPv6 könnten Sie dies verwenden

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

es fängt jedoch nicht alles ab, da es bei IPv6 viel komplizierter ist. Laut Wikipedia sind alle folgenden Beispiele technisch korrekt, der obige reguläre Ausdruck fängt jedoch nur diejenigen mit einem * ab

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

Da die Hälfte dieses Regex mit der Tatsache umgeht, dass das letzte Segment am Ende keine Periode hat, könnten Sie es in zwei Hälften schneiden, wenn Sie eine "anstellen". bis zum Ende Ihrer möglichen IP -Adresse.

Etwas wie das:

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

Ich bin mir über die IPv6-Regeln nicht sicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top