我有一个输入文件,其中每一行都有以下格式的字符串输入值:
" ab cd " , " efgh,ijk.", 4,"lmno"
即,
编辑:3。输入可以用逗号分隔。(abc,"Hi Mary,Joe",5
)
在java中使用.Split(),我需要一个正则表达式来输出:
ab cd
efgh,ijk.
4
lmno
我试过了:
[^",]*[\",]
但这不适用于"efgh,ijk."
以下是正则表达式测试的链接:http://regexpal.com/ 我需要一些帮助。请帮忙。 谢谢
答案 0 :(得分:2)
正则表达式模式:(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*,?)+?
更新空值:(?:\s*(?:\"([^\"]*)\"|([^,]+))\s*,?|(?<=,)(),?)+?
DEMO
它工作的一个例子,我知道它有点像CSV格式,但只要你不写真正奇怪的东西它就会匹配所有这些。
Matcher ma = Pattern.compile("(?:\\s*(?:\\\"([^\\\"]*)\\\"|([^,]+))\\s*,?)+?").matcher(" \" ab cd \" , \" efgh,ijk.\", 4,\"lmno\"");
while (ma.find()) {
if (ma.group(1) == null) {
System.out.println(ma.group(2));
} else {
System.out.println(ma.group(1));
}
}
编辑,顺便说一句,如果您希望我们为您提供代码,请不要告诉我们有关正则表达式的在线测试人员,如果您这样做,那是因为您知道如何处理正则表达式,如果您不知道该怎么做那个,也问一下。
答案 1 :(得分:2)
我建议找到匹配项,然后修剪它们以获得最终结果。
Matcher m = Pattern.compile("\\s*(?:\"[^\"]*\"|(?:^|(?<=,))[^,]*)").matcher(s);
while (m.find()) {
System.out.println(m.group().replaceAll("^\\s*\"?\\s*(.*?)\\s*\"?\\s*$", "$1"));
}
请参阅this demo。
答案 2 :(得分:1)
尝试使用split()
(demo)来调用(?:^\s*"\s*|\s*"\s*$|\s*"?\s*,\s*"?\s*)
。
这也将匹配一个String中包含的逗号,这在您的情况下是错误的。但如果您要使用split()
,这是唯一的方法。您可以介绍一些转义包含逗号的方法(如\,
),这可以很容易地添加到正则表达式中。
否则你将不得不使用其他一些方法来消除字符串,split()
对你没用。
答案 3 :(得分:0)
如果您不想使用正则表达式,正则表达式意味着它是'regular' expression。 “我认为这里有一种模式”不是正则表达式。它们很好,它们很快,我只在完全控制输入到正则表达式的输入时使用它们。
//no development environment up, there may be compilation errors.
private static String[] csv(final String input){
String[] inputArray = input.split(",");
for(int i =0;i < inputArray.length;i++){
//org.apache.commons.lang.StringUtils
String value = StringUtils.removeEnd(inputArray[i],"\"");
value = StringUtils.removeStart(value,"\"");
value = StringUtils.trim(value);
inputArray[i] = value;
}
return inputArray;
}