解析数字地址

时间:2016-11-30 16:45:03

标签: java regex

我一直在尝试使用正则表达式解析字符串中的数字地址。

到目前为止,我已经能够从字符串http://63.88.73.26:80/成功获得(部分)63.88.73.26:80的数字地址。但是我一直试图跳过:80 /,并且没有运气。

到目前为止我尝试的是:

Pattern.compile("[0-999].*[0-999][\\p{Digit}]", Pattern.DOTALL);

然而,仍然包括:80

我不知道我在这里缺少什么,我试图在最后检查\ p {数字},但这并没有做太多

谢谢你的时间!

2 个答案:

答案 0 :(得分:1)

您正在寻找积极展望 (?=...)。只有当后面跟着一个特定的表达式时才会匹配,即正面向前看的括号中的表达式。你可以用最简单的形式

[0-9\.]+(?=:[0-9]{0,4})

虽然你可能想要用更完整的东西更改[0-9\.]+部分(匹配1位或更多位数或句号)来检查你是否有正确形成的地址

查看regexr.com,在这里你可以根据自己的内容调整表达方式,直到它有效......

答案 1 :(得分:1)

请注意,Pshemo使用URLgetHost()指示了正确的方法:

  

获取此URL的主机名(如果适用)。主机的格式符合RFC 2732,即对于文字IPv6地址,此方法将返回方括号('['']')中的IPv6地址。

因此,最好在这里使用正确的工具:

import java.net.*;
....
String str = new URL("http:" + "//63.88.73.26:80/").getHost(); 
System.out.println(str); // => 63.88.73.26

请参阅Java demo

你提到你想要学习正则表达式,所以让我们检查你的模式:

  • [0-999] - 匹配任意1个数字,一个数字(0-9创建一个与0 .. 9匹配的范围,以及两个9 s是多余的,可以删除)
  • .* - 任何0+字符,贪婪,直到最后......
  • [0-999] - 见上文(任意1位数)
  • [\\p{Digit}] - 任何Unicode数字

这意味着,您匹配一个以数字开头的字符串,直到最后一次出现2个连续数字。

您需要一系列数字和点。有多种方法可以提取这些字符串。

  1. 使用具有精确字符规范的详细模式以及您需要的出现次数:[0-9]{1,3}(?:\.[0-9]{1,3}){3}(整个匹配 - matcher.group() - 保存所需的值。)
  2. 使用“强力”字符类方法(请参阅Jonathan's answer),但我使用捕获组而不是前瞻,并使用未转义的点,因为在角色内部class被视为文字点:([0-9.]+):[0-9](现在,值在matcher.group(1)
  3. “花哨”“两串之间的字符串”方法:必须捕获:/之间的http://:以外的所有文字进入群组 - https?://([^:/]+):(同样,值在matcher.group(1)
  4. 一些示例代码(方法#1):

    Pattern ptrn = Pattern.compile("[0-9]{1,3}(?:\\.[0-9]{1,3}){3}");
    Matcher matcher = ptrn.matcher("http://63.88.73.26:80/");
    if (matcher.find()) {
        System.out.println(matcher.group());
    }
    

    必读:Character Classes or Character Sets