字符串正则表达式拆分打印输出包含的行数少于预期?

String regex split printout contains fewer lines than expected?

我们有以下代码

String quote = "aba*abaa**aabaa***";
String[] words = quote.split("a\**");
for (String word : words) {
  System.out.println(word);
}

正则表达式恰好是一个 'a' 个字符,后跟零个或多个“*”字符

这意味着字符串标记如下:a, b, a*, a, b, a, a**, a, a, b, a, a***(这也可以是双精度的使用 Pattern/Matcher 类)

检查

但是,上面的 System.out.println() 正在生成以下打印输出:(空行), b, (空行), b, (3 空行), b

这里没搞清楚,为什么第一和第二之间只有一个空行'b'(中间有两个token),为什么第二和第三之间有三个空行'b'(中间有四个标记)?

如果有 k 个标记,则应该有 k - 1 个空行,因此它按预期工作。我们来看一个例子:ba*ab,它被标记为 b, a*, a, b。两个分隔符之间只有一个东西,所以它只给出一个空字符串。

在第一个和第二个 b 之间,我们有 ba*ab。拆分方法中使用的定界符模式将匹配 a*,后跟空字符串,然后匹配 a 后跟 bSystem.out.println().

将空字符串显示为空行

同样,在第二个和第三个b之间,子串是baa**aab。因此,分隔符匹配 a,然后是一个空字符串,然后是 a**,然后是另一个空字符串,然后是 a,然后是第三个空字符串,最后是另一个 a通过 b。因此总行数为 3.

ba          a**           a              ab
     ^^^           ^^^           ^^^
  emptystring   emptystring   emptystring

为了获得指定的列表,a, b, a*, a, b, a, a**, a, a, b, a, a***,一种解决方案是使用 Matcher:

构造列表
String quote = "aba*abaa**aabaa***";    
Pattern pattern = Pattern.compile("a\**");
Matcher matcher = pattern.matcher(quote);
List<String> words = new ArrayList<String>();
int start = 0;
while(matcher.find()) {
    if(start < matcher.start()) {
        words.add(quote.substring(start, matcher.start()));
    }
    words.add(matcher.group());
    start = matcher.end();
}