模式/匹配器Java,非零组计数但错误检索?

时间:2014-01-08 05:36:52

标签: java regex matcher

我的matcher.groupCount()给了我4但是当我使用matcher.group(0),...,matcher.group(0)时,它给了我一个错误。

以下是我的代码:

Pattern pattern = Pattern.compile("([0-9]+).([0-9]+).([0-9]+).([0-9]+)");
Matcher matcher1, matcher2;

GeoIP[0][0] = (GeoIP[0][0]).trim();
GeoIP[0][1] = (GeoIP[0][1]).trim();

System.out.println(GeoIP[0][0]);
System.out.println(GeoIP[0][1]);

matcher1 = pattern.matcher(GeoIP[0][0]);
matcher2 = pattern.matcher(GeoIP[0][1]);

System.out.println("matcher1.groupCount() = " + matcher1.groupCount());
System.out.println("matcher2.groupCount() = " + matcher2.groupCount());

System.out.println("matcher1.group(0) = " (matcher1.group(0)).toString());

控制台:

Exception in thread "main" 1.0.0.0
1.0.0.255
matcher1.groupCount() = 4
matcher2.groupCount() = 4

java.lang.IllegalStateException: No match found
    at java.util.regex.Matcher.group(Unknown Source)
    at filename.main(filename.java:linenumber)

行号指向

System.out.println("matcher1.group(0) = " (matcher1.group(0)).toString());

2 个答案:

答案 0 :(得分:9)

groupCount只是告诉你在正则表达式中定义了多少个组。如果您想要实际访问结果,则必须先执行匹配!

  if (matcher1.find()) {
    System.out.println("matcher1.group(0) = " (matcher1.group(0)).toString());
  } else {
    System.out.println("No match.");
  }

此外.是正则表达式中的特殊字符,您可能需要\\.

答案 1 :(得分:2)

如果我理解正确,您需要访问创建IP地址的四个字节。您可以尝试使用匹配IP地址的正则表达式,然后拆分找到的字符串,而不是使用组。

String GeoIPs = "192.168.1.21, 10.16.254.1, 233.255.255.255";
Pattern pattern = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
Matcher matcher;

matcher = pattern.matcher(GeoIPs);

while (matcher.find()) {
    String match = matcher.group();
    String[] ipParts = match.split("\\.");
    for (String part : ipParts) {
        System.out.print(part + "\t");
    }
    System.out.println();
}

关于用于IP提取的Java正则表达式有一些答案: Extract ip addresses from Strings using regexregex ip address from string