为啥 String.split 需要转义管道分隔符?

Posted

技术标签:

【中文标题】为啥 String.split 需要转义管道分隔符?【英文标题】:Why does String.split need pipe delimiter to be escaped?为什么 String.split 需要转义管道分隔符? 【发布时间】:2012-04-06 05:05:22 【问题描述】:

我正在尝试解析一个文件,该文件的每一行都带有管道分隔值。 当我没有在 split 方法中转义管道分隔符时它不能正常工作,但是在我如下转义管道后它可以正常工作。

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() 方法需要转义管道字符吗?

【问题讨论】:

下面的答案回答了“为什么”,但仅供参考,如果您尝试匹配文字字符串,您也可以查看Pattern.quote。它需要一个String 并返回一个与输入匹配的正则表达式String(即,它会为您处理所有转义)。 Pattern.quote+1 【参考方案1】:

因为split 的那个参数的语法是一个正则表达式,其中'|' 具有特殊的OR 含义,而'\|' 表示文字'|',所以字符串"\\|" 表示正则表达式'\|',表示完全匹配字符'|'

【讨论】:

感谢您的解释。我几乎总是忘记使用双重转义。现在我知道为什么会这样了,它肯定会帮助我从现在开始记住。 如果字符串行的值有一些管道字符会怎样?您如何能够在不拆分转义管道的情况下进行拆分 \| ? @AlexandreJ 您是否在问如何将如下所示的行拆分为:Some|Delimited|Text|With|An\|Embedded|Pipe|Char("Some", "Delimited", "Text", "With", "An\|Embedded", "Pipe", "Char")? split 函数不支持这样的转义,但您可以制作一个适用于这种情况的正则表达式,例如在组后面使用零宽度否定断言:(?&lt;!\\)\|,即line.split("(?&lt;!\\\\)\\|"); 【参考方案2】:

你可以这样做:

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

【讨论】:

你必须转义 \ 才能使用你的正则表达式 "yourString.split("\\|")" 这是正确的公式。【参考方案3】:

String.split 需要一个正则表达式参数。未转义的 | 被解析为正则表达式,意思是“空字符串或空字符串”,这不是您的意思。

【讨论】:

以上是关于为啥 String.split 需要转义管道分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

Java中split的用法

使用 String.split() 将带有引号的 csv 文件拆分为文本分隔符

解析字符串中管道分隔符内的文本[重复]

java数组和字符串相互转换

请问split("\\.")是啥意思?(JAVA代码)

java数组和字符串相互转换