6

我正在尝试使用简单的拆分来分解以下字符串: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

4 回答 4

9

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

如果你想使用正则表达式捕获组,你将不得不使用Matcher.group(), String.split() 不会这样做。

于 2010-06-07T05:13:35.487 回答
3

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

String s = "00-00000";

String pattern = "-";

String[] parts = s.split(pattern);
于 2010-06-07T05:19:35.760 回答
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);
            }
         }
    }
于 2010-06-07T06:32:22.347 回答
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参数 to 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] "
于 2010-06-07T06:34:52.720 回答