我有一个文本文件,其中|
(管道)作为分隔符。如果我正在读取一列并且列本身也包含|
,则会在创建分隔另一列时将其创建。
示例:
name|date|age
zzz|20-03-22|23
"xx|zz"|23-23-33|32
如何在双引号""
中转义字符?
如何转义拆分中使用的正则表达式,以便它适用于用户指定的分隔符
我试过了
String [] cols = line.split(“\ |”);
System.out.println(“让我们只看到列==”+ cols [1]);
答案 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