0

我需要用正则表达式匹配两个 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_]。这里我还要去掉“_”下划线。我尝试了不同的组合,但未能成功。请帮我解决这个正则表达式。

4

2 回答 2

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

我在这上面花了一些时间。这个正则表达式似乎有效。

于 2012-07-17T13:02:03.913 回答
0

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

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

这有效地说明了:

  1. 匹配单词边界(\b,这里:单词的开头)或非数字(\D)。
  2. 匹配 IP 地址。
  3. 匹配单词边界(\b,这里:单词的结尾)或非数字(\D)。

注1: ?:导致分组(\b|\D)不创建反向引用,即存储它找到的内容。您可能不需要存储单词边界/非数字。如果您确实需要存储它们,只需删除两个?:s.

注意 2:这可能是挑剔的,但您需要转义正则表达式的 IP 地址部分中的点,否则您还会匹配这些位置的任何其他字符。使用20.20.20.20而不是20\.20\.20\.20,例如,当您搜索日志文件时,您可能会匹配带有时间戳的行...

2012-07-18 20:20:20,20 INFO 应用启动成功,IP=20.20.20.200

20.20.20.200...根据您的问题,即使您正在寻找 IP 地址并且该特定的 ( ) 明确不应该匹配。诚然,这个例子是一个非常极端的例子。

于 2012-07-18T08:58:55.500 回答