2012-07-17 114 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)显然不应该匹配,根据你的问题。诚然,这个例子是相当有边缘的情况。