字符串正则表达式拆分打印输出包含的行数少于预期?
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
后跟 b
。 System.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();
}
我们有以下代码
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
后跟 b
。 System.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();
}