0

如何从给定网站中提取所有 IP:PORT? 我有这个当前的正则表达式模式,但我认为它并没有抓住所有..

或者这是一个更好的方法吗?

PATTERN = '((?:1?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:1?\d{1,2}|2[0-4]\d|25[0-5]):\d{2,5}';
4

3 回答 3

4

您可以使用 Internet Direct (Indy) 单元 IdURI 代替 RegEx。它可以将任何 URI 解析为其协议部分。它支持 IPv4 和 IPv6。该单元非常独立。

MyURI := TIdURI.Create('http://127.0.0.1:8080');
try
  MyHost := MyURI.Host;
  MyPort := MyURI.Port; 
finally
  MyURI.Free;
end;

属性公开有关 URI 的详细信息:

property Bookmark : string read FBookmark write FBookMark;
property Document: string read FDocument write FDocument;
property Host: string read FHost write FHost;
property Password: string read FPassword write FPassword;
property Path: string read FPath write FPath;
property Params: string read FParams write FParams;
property Port: string read FPort write FPort;
property Protocol: string read FProtocol write FProtocol;
property URI: string read GetURI write SetURI;
property Username: string read FUserName write FUserName;
property IPVersion : TIdIPVersion read FIPVersion write FIPVersion;

另请参阅此警告,但我认为它不会影响简单的 host:port URI 解析:

https://stackoverflow.com/a/502011/80901

我建议下载当前版本的 Indy 以获得最新修复。

于 2012-12-19T15:13:46.410 回答
3

如果IP 后面总是有一个端口,这将起作用:

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

火柴:

1.2.3.4:80
001.002.003.004:2345
255.255.255.255:13245

不匹配:

1.2.3
1.2.3:01
1.2.3.4.5:99
299.299.299.299:123
于 2012-12-19T13:59:20.070 回答
0

正则表达式不是你应该在与字符串有关的每个问题上挥舞的魔杖。在这种情况下,您使用的语言可能支持 URL 解析。

parse_url()在 PHP 中,您使用该函数解析 URL 。http://php.net/manual/en/function.parse-url.php

在 Perl 中,您使用 URI::URL 类http://search.cpan.org/dist/URI/

如果你真的想使用正则表达式,Perl 模块http://search.cpan.org/dist/Regexp-Common/已经为你构建了正则表达式来检测 IP 地址。

无论您使用哪种语言,有人已经编写、调试和测试了已经可以满足您需求的代码。使用现有代码而不是编写自己的代码。

于 2012-12-19T14:29:10.067 回答