我有一个简单的程序,可以查找您提供的IP的详细信息,我将向您展示我的一些代码示例
int regIndex = src.indexOf("Region:") + 16;
int endIndex = src.indexOf("<", regIndex);
String region = src.substring(regIndex, endIndex);
if(regIndex == 15) region = "None";
int counIndex = src.indexOf("Country:") + 17;
int couneIndex = src.indexOf(" <", counIndex);
String country = src.substring(counIndex, couneIndex);
正如您所看到的,绝对不是最有效的方法。我使用的网站提供了如下信息:http://whatismyipaddress.com/ip/1.1.1.1
我以前从未真正使用过正则表达式,但在我看来可能会有一个可以真正让它更高效,更容易编程,但我一直在环顾四周,我很丢失。
基本上我的问题是,我怎么能使用正则表达式(或者如果有另一种更有效的方法)。
任何帮助都会很棒, 谢谢:))
答案 0 :(得分:1)
您可以这样做:
String s = "bla Country: Australia <bla";
Pattern pattern = Pattern.compile("Country: (.*) [<]");
Matcher matcher = pattern.matcher(s);
if(matcher.find()) {
System.out.println("Country = " + matcher.group(1));
}
答案 1 :(得分:0)
来源看起来像这样
<tr><th>Country:</th><td>Australia <img src="http://whatismyipaddress.com/images/flags/au.png" alt="au flag"> </td></tr>
使用正则表达式意味着匹配模式。
表明您想要的数据的模式非常简单Country:
。您还需要匹配以下标记,例如<\/th><td>
。唯一的问题是你需要逃避正斜杠。然后有你要查找的数据,我建议匹配不是<
的所有内容,所以[^<]
,这是一个在开头有否定的捕获组,意味着任何字符都是不是<
,重复此操作会在最后添加+
,这意味着至少有一个前面的字符。
所以,完整的事情应该是这样的:
Country:<\/th><td>\s*([^<]+)\s*<
我在这里也添加了括号,它们意味着将找到的模式放入变量中,因此您的结果可以在捕获组1中找到。我还添加了\s*
,这是一个重复0次或更多次的空白字符,这是为了匹配数据之前或之后的空格,我假设你不需要它。
答案 2 :(得分:0)
首先,有一些在线网站可以帮助您开发正则表达式。它们允许您输入一些文本和正则表达式,然后显示将表达式应用于文本的结果。这样可以节省您在开发表达式和扩展理解时编写代码的麻烦。我使用的一个好网站是FileFormat regex,因为它允许我针对多个测试字符串测试一个表达式。快速搜索还提出了regex Planet,RegExr和RegexPal。还有很多其他的。
就资源而言,Java Pattern class reference对Java开发非常有用,我也非常喜欢regular-expression.info。
对于您的问题,我使用了fileFormat.info并提出了这个正则表达式来匹配“http://whatismyipaddress.com/ip/1.1.1.1”:
.*//([.\w]+)/.*/(\d+(?:.\d+){3})
或作为java字符串:
".*//([.\\w]+)/.*/(\\d+(?:.\\d+){3})"
快速分解表示任何内容(.*
),后跟两个斜杠(//
),后跟至少一个或多个小数点或字符(([.\w]+)
),然后是斜杠,任意数量的字符和另一个斜杠(/.*/
),后跟至少1位数((\d+
),后跟3组小数点和至少一位数({{1} })。服务器名称部分和IP部分周围的括号集称为捕获组,您可以使用Java Matcher类上的方法返回这些部分的内容。 ip地址第二部分的(?:.\d+){3})
告诉它我们使用括号对字符进行分组,但不能将其视为捕获组。
这个正则表达式并不像它应该的那样严格或灵活,但它是一个起点。
所有这一切都可以通过以上链接进行研究。