我需要将两个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_]。在这里,我还想消除“_”下划线。我尝试了不同的组合,但没能成功。请帮我解决这个正则表达式。
答案 0 :(得分:1)
(.*[_]|[^(\w)]|^)10.10.10.10([_]|[^(\w)].*|$)
我花了更多的时间在这上面。这个正则表达似乎有效。
答案 1 :(得分:0)
我不知道您使用的是哪种语言,但使用类似Perl的正则表达式,您可以使用以下更短的表达式:
(?:\b|\D)20\.20\.20\.20(?:\b|\D)
这实际上说:
\b
,此处:字的开头)或非数字(\D
)。\b
,此处:字的结尾)或非数字(\D
)。 注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
)明显不匹配。不可否认,这个例子非常有优势。