可能的正则表达问题

时间:2011-06-24 05:48:03

标签: java regex

我有一个简单的程序,可以查找您提供的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

我以前从未真正使用过正则表达式,但在我看来可能会有一个可以真正让它更高效,更容易编程,但我一直在环顾四周,我很丢失。

基本上我的问题是,我怎么能使用正则表达式(或者如果有另一种更有效的方法)。

任何帮助都会很棒, 谢谢:))

3 个答案:

答案 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 PlanetRegExrRegexPal。还有很多其他的。

就资源而言,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})告诉它我们使用括号对字符进行分组,但不能将其视为捕获组。

这个正则表达式并不像它应该的那样严格或灵活,但它是一个起点。

所有这一切都可以通过以上链接进行研究。