我一直在尝试使用正则表达式解析字符串中的数字地址。
到目前为止,我已经能够从字符串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 :(得分:1)
您正在寻找积极展望 (?=...)
。只有当后面跟着一个特定的表达式时才会匹配,即正面向前看的括号中的表达式。你可以用最简单的形式
[0-9\.]+(?=:[0-9]{0,4})
虽然你可能想要用更完整的东西更改[0-9\.]+
部分(匹配1位或更多位数或句号)来检查你是否有正确形成的地址
查看regexr.com,在这里你可以根据自己的内容调整表达方式,直到它有效......
答案 1 :(得分:1)
请注意,Pshemo使用URL
和getHost()
指示了正确的方法:
获取此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个连续数字。
您需要一系列数字和点。有多种方法可以提取这些字符串。
[0-9]{1,3}(?:\.[0-9]{1,3}){3}
(整个匹配 - matcher.group()
- 保存所需的值。)([0-9.]+):[0-9]
(现在,值在matcher.group(1)
):
和/
之间的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());
}