StrTokenizer 拆分字符串的不一致行为
Inconsistent behaviour of StrTokenizer to split string
我正在尝试在给定的分隔符处拆分字符串,从而允许忽略位于引号内的分隔符。例如。
"foo; bar; 'foo; bar'"
在给定分隔符“;”的情况下应分成 3 个字符串并引用 char ':
foo
bar
foo; bar
我正在使用 StrTokenizer,但它似乎不适用于 "foo; bar; 'foo; bar'"
但它确实适用于 "'foo; bar'; foo; bar;"
谁能解释一下哪里出了问题?
import org.apache.commons.lang3.text.StrTokenizer;
public class Main {
public static void main(String[] args) {
String x= "foo; bar; 'foo; bar'";
StrTokenizer tokens= new StrTokenizer(x, ';', '\'');
for (String token : tokens.getTokenArray()) {
System.out.println(token.trim());
}
// Prints:
// foo
// bar
// 'foo
// bar'
/* --------- */
// THIS IS OK:
x= "'foo; bar'; foo; bar";
tokens= new StrTokenizer(x, ';', '\'');
for (String token : tokens.getTokenArray()) {
System.out.println(token.trim());
}
// Prints:
// foo; bar
// foo
// bar
}
}
看起来默认情况下引号区域前面不能有任何字符(甚至 space),除了定界符(所以 ; 'quote'
不行,但 ;'qupte'
可以) -(这有点奇怪,因为引号结尾和定界符之间的 space 似乎没有引起任何问题,这可能表明这可能是一个错误)。
显式设置应该是 trimmed 的字符似乎可以解决这个问题(而且您不再需要在打印语句中添加 trim()
):
StrTokenizer tokens = new StrTokenizer(x, ';', '\'');
tokens.setTrimmerMatcher(StrMatcher.spaceMatcher());// <- add this line
至 trim:space,制表符、换行符和换页符使用 StrMatcher.splitMatcher()
我正在尝试在给定的分隔符处拆分字符串,从而允许忽略位于引号内的分隔符。例如。
"foo; bar; 'foo; bar'"
在给定分隔符“;”的情况下应分成 3 个字符串并引用 char ':
foo
bar
foo; bar
我正在使用 StrTokenizer,但它似乎不适用于 "foo; bar; 'foo; bar'"
但它确实适用于 "'foo; bar'; foo; bar;"
谁能解释一下哪里出了问题?
import org.apache.commons.lang3.text.StrTokenizer;
public class Main {
public static void main(String[] args) {
String x= "foo; bar; 'foo; bar'";
StrTokenizer tokens= new StrTokenizer(x, ';', '\'');
for (String token : tokens.getTokenArray()) {
System.out.println(token.trim());
}
// Prints:
// foo
// bar
// 'foo
// bar'
/* --------- */
// THIS IS OK:
x= "'foo; bar'; foo; bar";
tokens= new StrTokenizer(x, ';', '\'');
for (String token : tokens.getTokenArray()) {
System.out.println(token.trim());
}
// Prints:
// foo; bar
// foo
// bar
}
}
看起来默认情况下引号区域前面不能有任何字符(甚至 space),除了定界符(所以 ; 'quote'
不行,但 ;'qupte'
可以) -(这有点奇怪,因为引号结尾和定界符之间的 space 似乎没有引起任何问题,这可能表明这可能是一个错误)。
显式设置应该是 trimmed 的字符似乎可以解决这个问题(而且您不再需要在打印语句中添加 trim()
):
StrTokenizer tokens = new StrTokenizer(x, ';', '\'');
tokens.setTrimmerMatcher(StrMatcher.spaceMatcher());// <- add this line
至 trim:space,制表符、换行符和换页符使用 StrMatcher.splitMatcher()