不能从字符串中取数字

时间:2013-05-16 07:56:36

标签: java regex

我正在尝试使用Pattern从字符串中取数字。

包含我的数字的字符串如下所示:

{1,3}{4,5}...{6,7}

我的输出应该是:

1 3
4 5
...
6 7 

代码:

private static void products(final String products) {
    final String regex = "(\\{([0-9]+),([0-9]+)\\})+";


    final java.util.regex.Pattern p = java.util.regex.Pattern.compile(regex);

    final Matcher matcher = p.matcher(products);
    if(!matcher.matches()) {
        throw new IllegalArgumentException("Wrong semantic of products!");
    }

    while(matcher.find()) {
        System.out.print(matcher.group(1) + " ");
        System.out.println(matcher.group(2));
    }
}

我遇到的问题是对上述函数的调用不会打印出任何内容。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

您最后需要取出+,因为您希望一次提取一个。{/ p>

整个事情在括号中,这将是第1组,要么使其成为不匹配的组(使用?:),要么从2开始。由于添加了{{{},删除括号将无效1}}在以下正则表达式中(参见代码)。

+检查整个字符串,如果没有matcher.matches,则无法使用正则表达式,您可能仍需要原始正则表达式。

此外,在同一+上使用matches然后find将无效,因为Matcher将移动字符串中的当前位置,因此,如果它匹配,它将在字符串的末尾。因此,matches将找不到任何内容,因为没有字符串可供搜索。您可以使用find上的reset来重置其位置,但这显然无法解决上述问题。

更新的代码:

Matcher

Test

对于任何感兴趣的人,这里有一种方法可以在1遍中完成:( private static void products(final String products) { final String regex = "(?:\\{([0-9]+),([0-9]+)\\})"; // validation final Pattern pAll = Pattern.compile(regex + "+"); if (!pAll.matcher(products).matches()) { throw new IllegalArgumentException("Wrong semantic of products!"); } // extraction final Pattern p = Pattern.compile(regex); final Matcher matcher = p.matcher(products); while (matcher.find()) { System.out.print(matcher.group(1) + " "); System.out.println(matcher.group(2)); } } 遍历整个字符串,从而导致2次遍历字符串)

matches

唯一的缺点是它会在找到无效数据之前打印出所有值。

例如,private static void products(final String products) { final String regex = "\\{([0-9]+),([0-9]+)\\}"; final Pattern p = Pattern.compile(regex); final Matcher matcher = p.matcher(products); int lastEnd = 0; while (matcher.find()) { if (lastEnd != matcher.start()) throw new IllegalArgumentException("Wrong semantic of products!"); System.out.print(matcher.group(1) + " "); System.out.println(matcher.group(2)); lastEnd = matcher.end(); } if (lastEnd != products.length()) throw new IllegalArgumentException("Wrong semantic of products!"); } 将打印出来:

products("{1,3}{4,5}a{6,7}");
抛出异常之前的

(因为直到字符串有效为止)。

答案 1 :(得分:2)

另一种解决方案:

private static void products2(final String products) {
    final String regex = "\\{([0-9]+),([0-9]+)\\}";

    if (products.split(regex).length > 0) {
        throw new IllegalArgumentException("Wrong semantic of products!");
    }

    final Matcher matcher = Pattern.compile(regex).matcher(products);
    while (matcher.find()) {
        System.out.print(matcher.group(1) + " ");
        System.out.println(matcher.group(2));
    }
}

这个可能效率较低(String.split(...))但可能更优雅(将验证与处理分开)。

答案 2 :(得分:0)

另一个解决方案是将字符串拆分为“}”,然后遍历生成的数组并提取数字。每个数组元素应匹配“\\ {(\\ d +),(\\ d +)”