我将尝试分析具有每行加管道分隔值的文件。当我不没有转义的管道分隔符拆分方法中,但之后我转义,如下所示的管道正常运行,则它未无法正常工作。

private ArrayList<String> parseLine(String line) {
    ArrayList<String> list = new ArrayList<String>();
    String[] list_str = line.split("|"); // note the escape "" here
    System.out.println(list_str.length);
    System.out.println(line);
    for(String s:list_str) {
        list.add(s);
        System.out.print(s+ "|");
    }
    return list;
}

有人请解释为什么管道字符需要进行转义的split()方法?

2012-03-21 16:21:39
问题评论:

下面的答案回答了"原因",但只需注意,如果您正在尝试匹配字符串还可能在Pattern.quote看到。它接受一个String并返回正则表达式将匹配输入String(即,它负责所有转义为您)。

Pattern.quote的 + 1

回答:

String.split要求的正则表达式参数。作为正则表达式分析非转义|意味着"空字符串或空字符串",它不是什么意思。

因为拆分该参数的语法是一个正则表达式,指出在哪些地方 | 具有特殊意义的 OR,和 ' |' 意味着文本 | 因此字符串" |"表示的正则表达式 | 这意味着匹配的字符完全 |。

感谢您的以下说明。我总是忘记使用双引号转义。现在,我知道它为什么是这样,这将肯定有助于从现在起请记住我。

如果字符串行的值包含一些管道字符会怎么样?如何将您能够拆分不拆分转义管道 |?

@AlexandreJ 是您询问如何拆分的行,如下所示︰Some|Delimited|Text|With|An|Embedded|Pipe|Char("Some", "Delimited", "Text", "With", "An|Embedded", "Pipe", "Char")Split 函数不支持转义示,但您可以手工创建将使用这种情况下,像零宽度负断言查看组后面的正则表达式︰ (?<!)|这将会是line.split("(?<!\)|");

只是可以执行此操作︰

String[] arrayString = yourString.split("|");

必须转义以使用您在正则表达式"yourString.split("|")"这就是正确的公式。

请输入您的翻译

Why does String.split need pipe delimiter to be escaped?

确认取消