【问题标题】:Inconsistent behaviour of StrTokenizer to split stringStrTokenizer 拆分字符串的行为不一致
【发布时间】:2016-11-04 19:28:57
【问题描述】:

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

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

【问题讨论】:

    标签: java string split quotes


    【解决方案1】:

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

    显式设置应该修剪的字符似乎可以解决这个问题(而且您不再需要在打印语句中添加trim()):

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

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

    【讨论】:

    • 非常感谢!我有点惊讶这种(常见的?)任务需要这种违反直觉的编码(恕我直言)。我发现的大多数解决方案都涉及我试图避免的正则表达式。顺便说一句,我不需要坚持使用 StrTokenizer,如果有的话,我很乐意切换到更好的选择......
    • 嗯,更好的选择可能取决于你真正在做什么。起初我虽然你正在尝试解析 CSV 文件,所以也许一些 CVS 解析器会是更好的工具,但是这些文件中的分隔符没有任何需要修剪的不必要字符(所以你甚至不会在这种情况下结束)。但也许有更好的 CVS 解析器可以简化我不知道的任务。
    • 不,不是 CSV 文件。我只需要拆分一个看起来像命令行参数的字符串。 StrTokenizer 似乎完全符合我的要求,直到我遇到上面的测试用例,这真的很基本。
    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    相关资源
    最近更新 更多