用于解析IP的正则表达式

时间:2010-11-03 08:10:17

标签: regex

我正在使用正则表达式解析IP地址并提取其主机,端口,用户名和密码。

以下是我感兴趣的格式:

6 个答案:

答案 0 :(得分:7)

尝试这样的事情

(http://(\w+:\w+@)?)?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})?

说明:

(http://(\w+:\w+@)?)? - optional group of http:// followed by optional user:pass@
(\d{1,3}\.){3} - three groups of one to three digits followed by a dot
\d{1,3} - one to three digits
(:\d{1,5})? - optional group of colon followed by one to five digits

答案 1 :(得分:4)

以这种方式进行比赛可能不是最佳做法。最好使用真正的智能插入某种代码,可以进行通用的URI解析。但是,如果您的需求有限,并且可以彻底评论/记录您的代码在需要更多代码时会破坏,那么沿着这条路走下去也许是有意义的。

最简单的方法是匹配四组1到3位数字:

  • 可选地,一个或多个不 - :,加上:,加一个或多个不 - @,再加上@
  • 可选,:,加上1到5位

类似的东西:

([^:]+:[^@]+@)?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})?

但这会接受愚蠢的东西,比如“999.999.999.999:99999”

如果您只想接受有效的 IP地址,并且不关心它恰好是URI的一部分,或者不关心字符串中存在的其他垃圾,这里是一个例子:

http://www.regular-expressions.info/examples.html

它基本上匹配四组:

  • 2,加0-4,加0-9
  • 或2,加5,加0-5
  • 或1,加上0-9,加上0-9
  • 或1-9,加上0-9
  • 或0-9

这应该让你开始。

  • 可选地,一个或多个不 - :,加上:,加一个或多个不 - @,再加上@(最大长度可能很有趣,这里)
  • 可选,:,加上0-65535(根据上述0-255规则,我会留给您的)

还有其他基于范围的规则可用于匹配您可能希望避免的IP地址(诸如0.0.0.0和保留范围之类的内容),但可能更容易对这些进行后续匹配。

基本上,我建议您使用非常简单的示例,或插入库中。

答案 2 :(得分:2)

你可以从那开始(python):

import re

pattern = "((?P<login>\w+):(?P<password>\w+)@)?(?P<ip>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})(:(?P<port>\d+))?"

re.match(pattern, "12.34.56.789").groupdict()
re.match(pattern, "12.34.56.789:80").groupdict()
re.match(pattern, "john:pass@12.34.56.789:80").groupdict()

显然,您指定的IP无效(如Matt所说......)

答案 3 :(得分:2)

这是一个用perl编写的小脚本,用于执行以下操作 a)在检查前者以字符开头后,删除用户名和密码 b)验证IP地址 c)验证端口

#!/usr/bin/perl

    while (<>) {
    chomp;
            if (/(?:(?:([a-zA-z]\w+)\:(\w+))@)?((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}))(?:\:(\d{1,5}))?/) {
                    print "username=$1\n";
                    print "password=$2\n";
                    print "ip address=$3\n";
                    print "port=$8\n";
                    print "Warning: IP Address invalid\n" if ($4>255||$5>255||$6>255||$7>255);
                    print "Warning: Port Address invalid\n" if ($8>65535);
            }
    }

编辑:以下tchrist的建议

答案 4 :(得分:0)

Regexlib将是您问题的有用资源。你可以找到很多解决方案(可能你需要结合一些)

答案 5 :(得分:0)

仅用于匹配有效的IP地址

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}

而不是

([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])(\.([01]?[0-9][0-9]?|2[0-4][0-9]|25[0-5])){3}

因为许多正则表达式引擎匹配OR序列中的第一种可能性

你可以试试你的正则表达式引擎:10.48.0.200