我正在使用正则表达式解析IP地址并提取其主机,端口,用户名和密码。
以下是我感兴趣的格式:
答案 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位数字:
类似的东西:
([^:]+:[^@]+@)?(\d{1,3}\.){3}\d{1,3}(:\d{1,5})?
但这会接受愚蠢的东西,比如“999.999.999.999:99999”
如果您只想接受有效的 IP地址,并且不关心它恰好是URI的一部分,或者不关心字符串中存在的其他垃圾,这里是一个例子:
http://www.regular-expressions.info/examples.html
它基本上匹配四组:
这应该让你开始。
还有其他基于范围的规则可用于匹配您可能希望避免的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