![](/img/trans.png)
[英]Count number of commas within a string except for commas between double quotes
[英]Split a string on commas not contained within double-quotes with a twist
我之前提出过这个问题并且因为它是一个副本而被关闭了,我接受并实际在Java问题中找到答案:拆分逗号分隔的字符串但忽略引号中的逗号 ,所以感谢发布它的人。
但是我已经遇到了另一个问题。 显然我需要做的是当有零或偶数个双引号时使用“,”作为我的分隔符,但也忽略括号中包含的任何“,”。
所以以下内容:
"Thanks,", "in advance,", "for("the", "help")"
将标记为:
我不确定是否有任何修改我正在使用的当前正则表达式允许这样做,但任何指导将不胜感激。
line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
有时候更容易匹配你想要的而不是你不想要的东西:
String s = "\"Thanks,\", \"in advance,\", \"for(\"the\", \"help\")\"";
String regex = "\"(\\([^)]*\\)|[^\"])*\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(s.substring(m.start(),m.end()));
}
输出:
"Thanks,"
"in advance,"
"for("the", "help")"
如果你还需要它忽略括号内的引号部分内的右括号,那么你需要这样:
String regex = "\"(\\((\"[^\"]*\"|[^)])*\\)|[^\"])*\"";
需要第二个更复杂版本的字符串示例如下:
"foo","bar","baz(":-)",":-o")"
输出:
"foo"
"bar"
"baz(":-)",":-o")"
但是,如果可能的话,我建议您更改数据格式。 如果您使用XML等标准格式来存储令牌,这将会容易得多。
自制的解析器很容易编写。
例如,这个ANTLR语法可以毫不费力地处理您的示例输入:
parse
: line*
;
line
: Quoted ( ',' Quoted )* ( '\r'? '\n' | EOF )
;
Quoted
: '"' ( Atom )* '"'
;
fragment
Atom
: Parentheses
| ~( '"' | '\r' | '\n' | '(' | ')' )
;
fragment
Parentheses
: '(' ~( '(' | ')' | '\r' | '\n' )* ')'
;
Space
: ( ' ' | '\t' ) {skip();}
;
并且很容易将其扩展为考虑转义引号或括号。
当将由该语法生成的解析器提供给以下两行输入时:
"Thanks,", "in advance,", "for("the", "help")"
"and(,some,more)","data , here"
它被解析如下:
如果您考虑使用ANTLR,我可以发布一些HOW-TO来从我发布的语法中获取解析器,如果您愿意的话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.