Java正则表达式按逗号分割字符串,但忽略引号和括号
我被这个正则表达式困住了 因此,我的意见如下:Java正则表达式按逗号分割字符串,但忽略引号和括号,java,regex,string,Java,Regex,String,我被这个正则表达式困住了 因此,我的意见如下: “起重机装置,(物理物体)”(X1,x2,x4),非“研究护士(发现)”所见,整体Tellabodestructure(X1,X8),“Besnoitia wallacei(有机体)”,“后斜视(有机体)”(X1,x2,x4),非脑内数值,“黄柿子(有机体)”(X1,x2,x4),非缝合手术(X1) 最后我想得到的是: “起重机装置(物理对象)”(X1、x2、x4) 不是“研究护士(发现)”看到的 整个Tellabodystructure(X
- “起重机装置,(物理物体)”(X1,x2,x4),非“研究护士(发现)”所见,整体Tellabodestructure(X1,X8),“Besnoitia wallacei(有机体)”,“后斜视(有机体)”(X1,x2,x4),非脑内数值,“黄柿子(有机体)”(X1,x2,x4),非缝合手术(X1)
- “起重机装置(物理对象)”(X1、x2、x4)
- 不是“研究护士(发现)”看到的
- 整个Tellabodystructure(X1,X8)
- "白背飞虱(生物)"
- “内斜视(有机体)”(X1、x2、x4)
- 非脑内平均值
- “维吉尼亚薯蓣(生物)”(X1、x2、x4)
- 未缝合手部程序(X1)
(\'[^\']*\')|(\"[^\"]*\")|([^,]+)|\\s*,\\s*
如果括号内没有逗号,它就可以工作。不要使用正则表达式。编写一个简单的解析器,跟踪遇到的括号数,以及是否在引号内。有关更多信息,请参阅:这是否满足您的需要
System.out.println(yourString.replaceAll(", not", "\nnot"));
假设不可能在
()
中嵌套()
,也不可能在“
中嵌套”
,您可以编写如下内容:
private static final Pattern CUSTOM_SPLIT_PATTERN =
Pattern.compile("\\s*((?:\"[^\"]*\"|[(][^)]*[)]|[^\"(]+)+)");
private static final String[] customSplit(final String input) {
final List<String> ret = new ArrayList<String>();
final Matcher m = CUSTOM_SPLIT_PATTERN.matcher(input);
while(m.find()) {
ret.add(m.group(1));
}
return ret.toArray(new String[ret.size()]);
}
私有静态最终模式自定义分割模式=
模式。编译(“\\s*((?:\”[^\“]*\”[124;[(][^)]*[)].[^\”(]+)+)”;
私有静态最终字符串[]customSplit(最终字符串输入){
最终列表ret=新的ArrayList();
最终匹配器m=自定义分割模式匹配器(输入);
while(m.find()){
ret.add(m.group(1));
}
返回ret.toArray(新字符串[ret.size()]);
}
(免责声明:未经测试)。RegEx
(\w+\s)?("[^"]+"|\w+)(\(\w\d(,\w\d)*\))?
Java代码
String input = ... ;
Matcher m = Pattern.compile(
"(\\w+\\s)?(\"[^\"]+\"|\\w+)(\\(\\w\\d(,\\w\\d)*\\))?").matcher(input);
while(matcher.find()) {
System.out.println(matcher.group());
}
输出
"Crane device, (physical object)"(X1,x2,x4)
not "Seen by research nurse (finding)"
EntirePatellaBodyStructure(X1,X8)
not "Besnoitia wallacei (organism)"(X1,x2,x4)
not "Catatropis (organism)"(X1,x2,x4)
not IntracerebralRouteQualifierValue
not "Diospyros virginiana (organism)"(X1,x2,x4)
not SuturingOfHandProcedure(X1)
关于
not
和()
!的任何特殊之处看起来都是一个完整的解析器,而不是正则表达式。这实际上是prolog命令,但在本例中是“not”“没有效果。括号中还有一个变量,但可以是空的。有趣的查询。我想知道柿子和膝盖或手缝线有什么关系。:-)@杰森:我希望它是复制品。我花了两个多小时试图在这里找到解决方案。我考虑过这个问题。对不起,我举了一个坏例子。当然“不”在这里是没有义务的。啊,好吧,我现在明白了,通过你更新的例子,我相信其他人的解决方案中的一个会对你起作用。通过我在beging your Regex中给出的例子,你的Regex工作得很完美。但是,不幸的是,更新后的示例并不是没有任何引用的部分。不过还是谢谢你,我会努力改进的。检查更新。根据您的新要求添加了正则表达式。