我有一个csv文件,我想使用String split()
方法。我希望split()
返回的数组的每个元素都是csv中逗号分隔的值。但是,csv文件中还有其他逗号。
幸运的是,这些其他逗号都像'\,'
我无法为split()
方法获得正确的正则表达式。我想用逗号分隔,前面没有转义字符。
我目前的代码是:
String[] columns = new String[CONST];
columns = someString.split("*^\\,*");
对我来说,这说:用逗号分隔,但逗号前的字符不能是转义字符。允许逗号之前或之后的任意数量的字符。
答案 0 :(得分:0)
首先,逗号在您使用的位置没有特殊含义,因此您可以省略转义
你的正则表达式中最大的问题是,仅*
并没有给你任何意义。 *
表示任何先前令牌的出现。
所以正则表达式应该是
.*,.*
(我认为转义逗号仍然可以正常.*\,.*
)
然后,开始使用,您正在使用String.split()
中的正则表达式。 String.split()
期望分隔符的正则表达式。因此,您只应传递,
作为正则表达式。将.*,.*
作为“分隔符”会给您带来意想不到的结果(您可以尝试一下)。
答案 1 :(得分:0)
由于我在搜索时点击此页面,我将按照说明回答问题,并使用正确的模式(并且为了完整性):
columns = someString.split("[^\\\\],");
请注意,您需要4个转义字符,因为您需要2个转义字符才能在字符串中创建1个转义字符。换句话说," \\"创建字符串\。所以" \\\\"创建字符串\\,它在正则表达式中转义转义以在正则表达式中创建char \。因此,在字符串中需要4个转义字符才能在正则表达式中创建一个转义字符。括号和克拉是制作非陈述的一种方式(特别是对于单个字符)。
您还可以围绕您不想用引号拆分的CSV条目。然后使用以下解决方案:Java: splitting a comma-separated string but ignoring commas in quotes。
由于我编写的环境,我个人的偏好是使用拆分第三方解析器。
答案 2 :(得分: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)