2012-07-17 113 views
0

我需要用正則表達式匹配兩個ip地址/主機名: 像20.20.20.20IP地址/主機名匹配的正則表達式

should match with  20.20.20.20 
should match with  [http://20.20.20.20/abcd] 
should not match with 20.20.20.200 
should not match with [http://20.20.20.200/abcd] 
should not match with [http://120.20.20.20/abcd] 
should match with  AB_20.20.20.20 
should match with  20.20.20.20_AB 

目前我使用這樣的正則表達式:"(.*[^(\w)]|^)20.20.20.20([^(\w)].*|$)" 但它不適用於最後兩種情況。由於「\ w」等於[a-zA-Z0-9_]。這裏我也想消除「_」下劃線。我嘗試了不同的組合,但無法成功。請用這個正則表達式來幫助我。

回答

1
(.*[_]|[^(\w)]|^)10.10.10.10([_]|[^(\w)].*|$) 

我花了一些時間在this.This正則表達式似乎工作。

0

我不知道你使用的語言,而是用類似Perl的正則表達式,你可以使用下面的,較短的表達式:

(?:\b|\D)20\.20\.20\.20(?:\b|\D)

這有效地說道:

  1. 比賽字邊界(\b,這裏是:字的開頭)或非數字(\D)。
  2. 匹配IP地址。
  3. 匹配單詞邊界(\b,這裏是:單詞的結尾)或非數字(\D)。

注1:?:導致分組(\b|\D)不創建一個反向引用,即存儲它已經找到。您可能不需要存儲單詞邊界/非數字。如果你確實需要將它們存儲,只需刪除兩個?:即可。

注2:這可能是挑剔的,但你需要在正則表達式的IP地址部分避開點,否則你也會在這些位置匹配任何其他字符。使用20.20.20.20,而不是20\.20\.20\.20,你可能例如匹配攜帶,當你通過日誌文件搜索時間戳的行...

2012-07-18 20:20:20,20 INFO Application startup successful, IP=20.20.20.200

...即使你要找的IP地址和特定一個(20.20.20.200)顯然不應該匹配,根據你的問題。誠然,這個例子是相當有邊緣的情況。