IPを評価するにはどうすればよいですか?
-
09-06-2019 - |
質問
文字列が IP アドレスであるかどうかを判断するにはどうすればよいですか?どちらか IPv4 または IPv6?
最小文字数と最大文字数は何ですか?
これは次のようなものになると思います 正規表現 答え。
解決
しかし、問題は仮定するほど単純ではありません a.b.c.d
... あなたが思っているよりもはるかに多くのフォームがあります.
しかし、これは本当に Google の質問でしょうか?かなり 毎 どこにでもある正規表現入門書では、例として IP が使用されています。 IPv4 + 正規表現 183,000 ヒットを達成しました!
他のヒント
以前にもこれを行ったことがありますが、次の Raymond Chen の投稿が気に入っています。
http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx
彼は基本的に、正規表現の利点を活かして正規表現を使用することを推奨しています。トークンを解析します。次に、結果を評価します。彼の例:
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;
}
それを見て、それが何をしているのかを理解するのははるかに簡単です。
.NET には、便利なメソッドを持つ IPAddress 型があります。 TryParse.
例:
if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
//validatedIPAddress is good
}
// or more simply:
bool IsValidIPAddress(string possibleIP){
return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}
IPv4 の場合は、この正規表現を使用できます。
\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
非常に複雑に見えますが、各クワッドを 0 ~ 255 の数値に制限することで機能します。
@スライスされていない:確かに、この問題は少し厄介になる可能性があります。
本当にあらゆる IP アドレスを処理する必要がある場合は、より洗練されたものを作成する必要があります。
ただし、ユーザーが適切な形式のデータを入力していることを確認するための基本的な検証を実行したいだけの場合は、上記の正規表現を使用して a.b.c.d モデルに制限するのが公平だと思います。
@unsliced は正しいですが、もちろん実装に依存します。サイトを訪問するユーザーからの IP を解析する場合は、x.x.x.x 形式である必要があるため、正規表現を使用しても問題ありません。
IPv6の場合はこれを使用できます
[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}
ただし、IPv6 でははるかに複雑になるため、すべてをキャッチできるわけではありません。ウィキペディアによると、次の例はすべて技術的に正しいですが、上記の正規表現は * が付いたもののみをキャッチします。
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
そのRegexの半分は、最後のセグメントに最後に期間がないという事実を処理しているため、「」をタックすると、半分にカットできます。可能なIPアドレスの最後まで。
このようなもの:
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 は次のようになります。 /\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/
IPv6のルールがよくわかりません。