2010-11-03 222 views
1

我在正則表達式之後解析IP地址並提取它們的主機,端口,用戶名和密碼。正則表達式來解析IP

這裏是格式,我感興趣的是:

+7

通過'http:// ...'是不是IP地址,但是一個URI。 – Gumbo 2010-11-03 08:12:08

+3

789不是有效的八位字節。另外:你到目前爲止嘗試過什麼? – 2010-11-03 08:19:45

+0

你在用什麼語言?有機會有比編寫自己的正則表達式更好的解決方案 – Gareth 2010-11-03 08:28:15

回答

1

您可以用(蟒蛇)開始:

import re 

pattern = "((?P<login>\w+):(?P<password>\w+)@)?(?P<ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})(:(?P<port>\d+))?" 

re.match(pattern, "12.34.56.789").groupdict() 
re.match(pattern, "12.34.56.789:80").groupdict() 
re.match(pattern, "john:[email protected]:80").groupdict() 

而且很明顯,你所指定的IP無效(馬特說...)

+0

不錯,命名的屬性可以更容易地與 – hoju 2010-11-03 21:59:35

0

Regexlib將是一個有用的資源,爲您的問題。你可以找到很多解決方案(可能你需要結合一些)

4

這樣做的比賽可能不是一個最佳做法。插入某種類型的代碼可能更好,它可以執行通用的URI解析。如果您的需求有限,並且可以對您的代碼進行徹底評論/記錄,如果您需要更多的代碼,那麼沿着這條路走下去也許是有道理的。

最簡單的方法是,以匹配四組1至3的數字,以:

  • 任選地,一種或更多的不可─:,加:加一個或更多的不可─@,加上@
  • 可選:加1到5個位數

喜歡的東西:

([^:]+:[^@][email protected])?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})? 

但這將接受愚蠢的東西,像「999.999.999.999:99999」

如果你只希望接受有效的IP地址,並不在意,這恰好是一個URI的一部分,或者不小心在字符串中存在什麼其他垃圾這裏是一個例子:

http://www.regular-expressions.info/examples.html

它基本上匹配四套:

  • 2,加0-4,加0-9
  • 或2,加5,加0-5
  • 或1,加0-9,0-9加
  • 或1-9,加0-9
  • 或0-9

應該讓你開始那。

  • 任選地,一種或更多的不可─:,加:加一個或更多的不可─@,@加(最大長度可以是有意思的,在這裏)
  • 任選:​​加0 -65535(根據上面的0-255規則,我將留給你)

還有其他基於範圍的匹配IP地址的規則,你可能想要避免(例如0.0.0.0 ,以及保留的範圍),但可能會更容易做後續的匹配。

基本上,我建議你使用非常簡單的例子,或插入一個庫。

+0

+1在發佈我之前沒有注意到這一點 – Philar 2010-11-03 09:17:45

+0

這會從中獲益巨大在'(?x)'模式下,所以即使你沒有包含實際的評論,你也可以得到一些認知分塊的肘關節。 – tchrist 2010-11-03 12:03:50

+0

@tchrist:我不知道你在說什麼,但它聽起來很有趣:)這是在引用perl嗎? grep的? – 2010-11-03 19:23:05

7

嘗試是這樣的

(http://(\w+:\[email protected])?)?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})? 

說明:

(http://(\w+:\[email protected])?)? - optional group of http:// followed by optional user:[email protected] 
(\d{1,3}\.){3} - three groups of one to three digits followed by a dot 
\d{1,3} - one to three digits 
(:\d{1,5})? - optional group of colon followed by one to five digits 
+0

一起工作,如果你指定ip是(1-255)中的一個數字,不是由0開始並且大於255,那麼它會好得多。 – jargalan 2010-11-03 08:47:00

+0

是的,它不是很健壯。請參閱Merlyn提供的鏈接,瞭解如何根據需要只允許某些數字組合的一些示例。 – 2010-11-03 08:59:55

+0

+1,我在我的答案(我自己計算出來)中有很好的這個實現,但我通過比較這個答案來「調試」它)(我有用戶名:password @ syntax backwards,lol )。儘管如此,這個更好 - 我更喜歡\ w,而我沒有可選的http://。解釋也更清晰。 – 2010-11-03 09:12:07

2

這裏是一個小腳本,在Perl颳起了一陣,做以下的事情 a)檢查與角色 B中前場首發)驗證IP地址 三)驗證口後,剔除了用戶名和密碼

#!/usr/bin/perl 

    while (<>) { 
    chomp; 
      if (/(?:(?:([a-zA-z]\w+)\:(\w+))@)?((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}))(?:\:(\d{1,5}))?/) { 
        print "username=$1\n"; 
        print "password=$2\n"; 
        print "ip address=$3\n"; 
        print "port=$8\n"; 
        print "Warning: IP Address invalid\n" if ($4>255||$5>255||$6>255||$7>255); 
        print "Warning: Port Address invalid\n" if ($8>65535); 
      } 
    } 

編輯:從tchrist建議如下

+1

如果您已經有'\ w',則不需要提及'\ d':它是多餘的。 – tchrist 2010-11-03 11:59:52

+0

@tchrist danke :) – Philar 2010-11-03 12:08:59

+1

既然您沒有兩件事可供選擇,您可以像'\ w +'一樣編寫'[\ w] +'。此外,可以更好地將'[a-z] [A-Z]'*寫成任何帶有Unicode「Letter」屬性的字符,簡寫爲'\ p {Letter}'或'\ pL'。 – tchrist 2010-11-03 12:21:48

0

的比賽完全有效的IP地址使用

(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]?)){3} 
代替

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

因爲許多正則表達式引擎匹配在第一種可能性或序列

你可以試試你的正則表達式引擎:10.48.0.200