2012-10-16 58 views
0

我試圖創建一個正則表達式來檢查IP是否有效&可用。我們希望排除那些匹配多播地址(例如224.0.0.2)和地址(如0.0.0.0)的地址。正則表達式 - 有效的IPv4,不包括多播地址和廣播地址

在範圍之間存在任何檢查的代碼0-255,但我不能工作了如何實現這一點。

到目前爲止我的代碼是

^(?:(?: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

通過在'.'上分割會比較容易,然後測試每個元素。 – Toto

+0

你是什麼意思分裂。 ?對不起,我對正則表達式相當陌生 – Oli

+0

我的意思是分開IP地址的4個元素。 – Toto

回答

0

這將是最便攜,最容易編寫,最容易維護將是部分。

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

這將只匹配有效的IP地址以及拆分各部分進行進一步的檢查

if (int(group[1]) != 224 and (int(group[1]) != 0 or int(group[2]) != 0 or int(group[3]) != 0 or int(group[4]) != 0) ... 

正則表達式是不是「而不是」經營好。

但是,如果你堅持把它作爲一個單一的正則表達式,那麼只需枚舉所有有效的選項。

\b(25[0-5]|2[0134][0-9]|22[0-35-9]|1[0-9][0-9]?|[2-9][0-9]|[2-9]) 
\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 
\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 
\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b 

...這是不完美的,因爲它只是測試的第一個字節是不是224或0。如果你想對0.0.0.0一個完整的測試,那麼你就必須重現15倍以上識別至少一個字節不爲零的所有組合。

當然,你會想要寫一個測試,以確保你爲所有40億組合返回正確的答案。不應該花太長時間才能運行... ;-)