2016-11-30 131 views
0

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

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

我迄今为止尝试是:

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

但确实还包括:80

我不知道我是缺少在这里,我试图检查\ p {数字}在结束,但那也没有太大的作用

感谢您的时间!

+0

为什么不标记标点符号然后处理条目? – duffymo

+0

'。*'正在消耗冒号。我会建议使用'“[0-9 \\。] *”'。 – RamenChef

+0

它真的必须是正则表达式吗? Java提供URL类。你可以像'new URL(“http://63.88.73.26:80/”).getHost()'一样使用它来获得'63.88.73.26'部分。 – Pshemo

回答

1

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

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

虽然你可能想改变[0-9\.]+部分(匹配1个或多个数字或完全停止)的东西更全面的检查,你有一个正确形成地址

退房regexr.com在那里你可以摆弄你表达你的心脏的内容,直到它的工作原理...

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创建一个匹配的范围.. 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),但我会使用捕获组而不是向前看,并使用一个未转义的点,因为在字符类中它将被视为字面点: ([0-9.]+):[0-9](现值是matcher.group(1)
  3. A“花哨”,“得到串两弦间”的方法:比:http://:之间/以外的所有文字必须被捕获到一组 - https?://([^:/]+):(再次,值在matcher.group(1)

一些示例代码(方法#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