1

我有一个 csv 文件,我想使用该String split()方法。我希望返回的数组的每个元素都是split()csv 中的逗号分隔值。但是,csv 文件中还有其他逗号。

幸运的是,这些其他逗号被转义为'\,'

我无法为该split()方法获取正确的正则表达式。我想用没有转义字符的逗号分隔。

我目前的代码是:

String[] columns = new String[CONST];
columns = someString.split("*^\\,*");

对我来说,这就是说:用逗号分隔,但逗号之前的字符不能是转义字符。逗号前后可以有任意数量的字符。

  1. 如何获得正确的正则表达式?
4

3 回答 3

1

首先,逗号在您使用的位置没有特殊含义,因此您可以省略转义

正则表达式中最大的问题是,*单独没有任何意义。*表示先前标记的任何出现。

所以正则表达式应该是

.*,.* (我认为转义逗号应该还是可以的 .*\,.*

然后,开始使用,您正在使用String.split(). String.split()期望分隔符的正则表达式。因此,您应该只传递 a,作为正则表达式。拥有.*,.*“分隔符”会给您带来意想不到的结果(您可以尝试一下)。

于 2013-01-21T04:41:11.400 回答
0

由于我在搜索时点击了此页面,因此我将按所述回答问题并输入正确的模式(并为了完整性):

columns = someString.split("[^\\\\],");

请注意,您需要 4 个转义字符,因为您需要 2 个转义字符才能在字符串中创建 1 个转义字符。换句话说, "\\" 创建字符串 \ 。所以“\\\\”创建了字符串\\,它在正则表达式中转义以在正则表达式中创建字符\。因此,您需要一个字符串中的 4 个转义字符才能在正则表达式中创建一个。方括号和克拉是做出非声明的一种方式(特别是对于单个字符)。

您还可以用引号将您不想拆分的 CSV 条目括起来。然后使用以下解决方案:Java:拆分逗号分隔的字符串,但忽略引号中的逗号

由于我编码的环境,我个人的偏好是使用拆分而不是 3rd 方解析器。

于 2015-01-14T19:58:49.483 回答
0

正确的方法是使用解析器(处理\\, \, ,),但使用简单的正则表达式可以工作;

jshell> "a,b".split("(?!\\\\),")
$2 ==> String[2] { "a", "b" }

如何测试不起作用的东西;

jshell> "a,b".split("[^\\\\],")
$1 ==> String[2] { "", "b" }

jshell> "a,b".split("*^\\,*")
|  java.util.regex.PatternSyntaxException thrown: Dangling meta character '*' near index 0
*^\,*
^
|        at Pattern.error (Pattern.java:1997)
|        at Pattern.sequence (Pattern.java:2172)
|        at Pattern.expr (Pattern.java:2038)
|        at Pattern.compile (Pattern.java:1760)
|        at Pattern.<init> (Pattern.java:1409)
|        at Pattern.compile (Pattern.java:1065)
|        at String.split (String.java:2307)
|        at String.split (String.java:2354)
|        at (#6:1)
于 2019-01-29T15:17:47.667 回答