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()