Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式按逗号分割字符串,但忽略引号和括号_Java_Regex_String - Fatal编程技术网

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工作得很完美。但是,不幸的是,更新后的示例并不是没有任何引用的部分。不过还是谢谢你,我会努力改进的。检查更新。根据您的新要求添加了正则表达式。