2008-09-03 122 views
7

如何確定字符串是否是IP地址? IPv4IPv6如何評估IP?

什麼是最少和最多的字符數?

我認爲這將是一個正則表達式答案

回答

3

但問題並不像假設a.b.c.d ... there are way more forms than you realised一樣簡單。

但是這肯定是Google的一個問題嗎?很多正則表達式引物,你可以找到任何地方使用IP爲例! ipv4 + regex得分183,000!

+0

但是由於您提供的鏈接是一篇很棒的文章,我選擇這個作爲正確的答案。 ;) – pek 2009-09-02 20:48:33

4

對於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。

0

由於該正則表達式的一半處理的事實,最後一段沒有一個週期結束時,你可以把它切成兩半,如果你釘一個「」到您可能的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) 
} 
0

@unsliced:真的,這個問題可能會變得有些瘋狂。

如果你確實需要處理任何可能的IP地址,那麼你必須把更復雜的東西放在一起。

不過,如果你只想做基本的驗證,以確保用戶輸入正確格式化數據,我認爲這是公平地限制他們與上述正則表達式A.B.C.D模型。

0

@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則顯得更爲複雜,acording維基百科的所有下面的例子是technicaly正確但上述正則表達式將只抓的那些帶*

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 
6

在.NET中有它有一個方便的方法TryParse的ip地址類型。

例子:

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

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

我這樣做過,但我喜歡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; 
} 

看起來更容易,並且饒有興趣地去理解它應該做什麼。

+0

我測試了它在各種輸入。似乎防彈。 – 2014-04-25 09:31:39

-1

的IPv4變爲:/\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/

我不知道有關IPv6的規則。