Java Split无法按预期工作

时间:2010-06-07 05:01:10

标签: java regex split matcher

我正在尝试使用简单的拆分来分解以下字符串:00-00000

我的表达是:^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])

我的用法是:

String s = "00-00000";

String pattern = "^([0-9][0-9])(-)([0-9])([0-9])([0-9])([0-9])([0-9])";

String[] parts = s.split(pattern);

如果我使用Pattern和Matcher类,我可以看到我的模式匹配,匹配器告诉我我的groupCount是7这是正确的。但是当我尝试分裂它们时,我没有运气。

4 个答案:

答案 0 :(得分:9)

String.split不使用捕获组作为结果。它找到任何匹配并将其用作分隔符。因此,结果String []是正则表达式匹配之间的子串。因为正则表达式匹配整个字符串,并且整个字符串作为分隔符,所以没有其他任何东西留下,所以它返回一个空数组。

如果你想使用regex capturing groups,你必须使用Matcher.group(),String.split()不会这样做。

答案 1 :(得分:3)

对于您的示例,您可以简单地执行此操作:

String s = "00-00000";

String pattern = "-";

String[] parts = s.split(pattern);

答案 2 :(得分:1)

我无法确定,但我认为您要做的是将每个匹配的组放入一个数组中。

    Matcher matcher = Pattern.compile(pattern).matcher();

    if (matcher.matches()) {
        String s[] = new String[matcher.groupCount()) {
           for (int i=0;i<matches.groupCount();i++) {
               s[i] = matcher.group(i);
            }
         }
    }

答案 3 :(得分:1)

来自文档:

  

String[] split(String regex) - 返回:通过在给定正则表达式的匹配项周围拆分此字符串计算的字符串数组

基本上,正则表达式用于定义输入字符串中的分隔符。您可以在模式中使用捕获组和反向引用(例如,用于外观),但最重要的是模式匹配的内容和位置,因为它定义了返回数组的内容。

如果您想使用正则表达式将原始字符串拆分为7个部分,那么您可以执行以下操作:

    String s = "12-3456";
    String[] parts = s.split("(?!^)");

    System.out.println(parts.length); // prints "7"

    for (String part : parts) {
        System.out.println("Part [" + part + "]");
    } // prints "[1] [2] [-] [3] [4] [5] [6] "

这会在零长度匹配断言(?!^)上进行拆分,除了字符串中的第一个字符之外的任何地方。这可以防止空字符串成为数组中的第一个元素,并且尾随空字符串已被丢弃,因为我们使用limit的默认split参数。

使用正则表达式来获取像这样的字符串的单个字符是一种过度杀伤力。如果您只有几个字符,那么最简洁的选项是在foreach上使用toCharArray()

    for (char ch : "12-3456".toCharArray()) {
        System.out.print("[" + ch + "] ");
    }

如果你有一个更长的字符串,这不是最有效的选择。


-

上拆分

这也可能是您正在寻找的:

    String s = "12-3456";
    String[] parts = s.split("-");

    System.out.println(parts.length); // prints "2"

    for (String part : parts) {
        System.out.print("[" + part + "] ");
    } // prints "[12] [3456] "