StrTokenizer分割字符串的行为不一致

时间:2016-07-02 14:57:35

标签: java string split quotes

我试图在给定的分隔符处拆分字符串,允许分隔符在引号内被忽略。例如。

"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
    }
}

1 个答案:

答案 0 :(得分:1)

看起来默认情况下引用区域前面除了分隔符之外不能有任何字符(偶数空格)(所以; 'quote'不行,但是;'qupte'很好) - (这有点奇怪因为引用结尾和分隔符之间的空格似乎没有引起任何问题,这可能表明这可能是一个错误。)

明确设置应修剪的字符似乎可以解决此问题(您也不再需要在打印语句中添加trim()):

StrTokenizer tokens = new StrTokenizer(x, ';', '\'');
tokens.setTrimmerMatcher(StrMatcher.spaceMatcher());// <- add this line

要修剪:空格,制表符,换行符和换页使用StrMatcher.splitMatcher()