IP地址/主机名匹配正则表达式

时间:2012-07-17 10:39:16

标签: sql regex

我需要将两个ipaddress / hostname与正则表达式匹配: 像20.20.20.20

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_]。在这里,我还想消除“_”下划线。我尝试了不同的组合,但没能成功。请帮我解决这个正则表达式。

2 个答案:

答案 0 :(得分:1)

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

我花了更多的时间在这上面。这个正则表达似乎有效。

答案 1 :(得分:0)

我不知道您使用的是哪种语言,但使用类似Perl的正则表达式,您可以使用以下更短的表达式:

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

这实际上说:

  1. 匹配字边界(\b,此处:字的开头)或非数字(\D)。
  2. 匹配IP地址。
  3. 匹配字边界(\b,此处:字的结尾)或非数字(\D)。
  4. 注1: ?:会导致分组(\b|\D)不创建反向引用,即存储它找到的内容。您可能不需要存储单词boundary / non-digits。如果您确实需要存储它们,只需删除两个?:

    注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)明显不匹配。不可否认,这个例子非常有优势。