繁体   English   中英

在Java中转义特殊字符

[英]Escape special characters in java

我有一个文本文件,具有| (管道)作为分隔器。 如果我正在阅读列,并且列本身也包含| 然后在分隔另一列的同时创建它。

范例:

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

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

如何在双引号“”中转义字符

这是一种方法:

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包含特殊的正则表达式符号(例如),这也将确保拆分能够按预期工作. |

您可以将其替换为其unicode序列(在使用管道定界之前)

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

您可以使用CSV解析器,例如OpenCSV或Commons CSV

这是解析它的一种方法

    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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM