逃避java中的特殊字符

时间:2011-11-09 09:58:23

标签: java

我有一个文本文件,其中|(管道)作为分隔符。如果我正在读取一列并且列本身也包含|,则会在创建分隔另一列时将其创建。

示例:

name|date|age
zzz|20-03-22|23
"xx|zz"|23-23-33|32

如何在双引号""中转义字符? 如何转义拆分中使用的正则表达式,以便它适用于用户指定的分隔符 我试过了  String [] cols = line.split(“\ |”);                 System.out.println(“让我们只看到列==”+ cols [1]);

4 个答案:

答案 0 :(得分:3)

  

如何在双引号中隐藏字符“”

这是一种方法:

String str = "\"xx|zz\"|23-23-33|32";

Matcher m = Pattern.compile("\"[^\"]*\"").matcher(str);
StringBuffer sb = new StringBuffer();
while (m.find())
    m.appendReplacement(sb, m.group().replace("|", "\\\\|"));

m.appendTail(sb);

System.out.println(sb);  // prints "xx\|zz"|23-23-33|32

为了让列回来你会做这样的事情:

String str = "\"xx\\|zz\"|23-23-33|32";
String[] cols = str.split("(?<!\\\\)\\|");

for (String col : cols)
    System.out.println(col.replace("\\|", "|"));

关于您的修改:

  

如何转义拆分中使用的正则表达式,以便它适用于用户指定的分隔符

您应该在要拆分的字符串上使用Pattern.quote

String[] cols = line.split(Pattern.quote(delimiter));

即使delimiter包含特殊的正则表达式符号,例如.|,这也可确保拆分按预期工作。

答案 1 :(得分:1)

您可以用它的unicode序列替换它(在用管道分隔之前)

但是你应该做的是调整你的解析器以考虑到这一点,而不是改变文件。

答案 2 :(得分:1)

您可以使用像OpenCSV ou Commons CSV

这样的CSV解析器

答案 3 :(得分:0)

这是一种解析它的方法

    String str = "zzz|20-03-22|23 \"xx|zz\"|23-23-33|32";
    String regex = "(?<=^|\\|)(([^\"]*?)|([^\"]+\"[^\"]+\".*?))(?=\\||$)";
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(str); 
    while(m.find()) {
        System.out.println(m.group());
    }   

<强>输出

zzz
20-03-22
23 "xx|zz"
23-23-33
32