Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]

Posted

技术标签:

【中文标题】Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]【英文标题】:Java regex split string by comma but ignore quotes and also parentheses [duplicate] 【发布时间】:2013-05-19 01:38:54 【问题描述】:

我被这个正则表达式卡住了。

所以,我输入如下:

“起重机装置,(物理对象)”(X1,x2,x4),不是“研究护士看到的(发现)”,EntirePatellaBodyStructure(X1,X8),“Besnoitia wallacei(有机体)”,“Catatropis(有机体) )"(X1,x2,x4), not IntracerebralRouteQualifierValue, "Diospyros virginiana (organism)"(X1,x2,x4), not SuturingOfHandProcedure(X1)

最后我想得到的是:

“起重机设备,(物理对象)”(X1,x2,x4) 不是“研究护士看到的(发现)” 整个髌骨结构(X1,X8) “Besnoitia wallacei(有机体)” “Catatropis(有机体)”(X1,x2,x4) 不是 IntracerebralRouteQualifierValue “Diospyros virginiana(有机体)”(X1,x2,x4) 不是 SuturingOfHandProcedure(X1)

我试过正则表达式

(\'[^\']*\')|(\"[^\"]*\")|([^,]+)|\\s*,\\s*

如果括号内没有逗号,它可以工作。

【问题讨论】:

not() 的任何特别之处! 看起来你想要的是一个完整的解析器,而不是正则表达式。 这实际上是 prolog 命令,但在这种情况下“not”不起作用。括号中还有一个变量,但它可以为空。 有趣的查询。我想知道柿子与膝盖或手缝有什么关系。 :-) @JasonS 我希望它是重复的。我花了两个多小时试图在这里找到解决方案。我已经考虑过这个问题。 【参考方案1】:

正则表达式

(\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)

【讨论】:

以我在请求您的正则表达式完美运行时给出的示例为例。但是,不幸的是,更新的示例不是,特别是没有任何引号的部分。不过还是谢谢你,我会努力改进的。 检查更新。根据您的新要求添加了正则表达式。【参考方案2】:

不要为此使用正则表达式。编写一个简单的解析器来跟踪遇到的括号数,以及您是否在引号内。更多信息请见:RegEx match open tags except Xhtml self-contained tags

【讨论】:

【参考方案3】:

这能满足你的需要吗?

System.out.println(yourString.replaceAll(", not", "\nnot"));

【讨论】:

对不起,我举了不好的例子。当然“不”在这里不是必须的。 嗯,好的,我现在了解您更新的示例,我相信其他人的解决方案之一将适用于您。【参考方案4】:

假设不可能将() 嵌套在() 中,并且不可能将\" 嵌套在"" 中,您可以这样写:

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()]);

(免责声明:未经测试)。

【讨论】:

以上是关于Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用逗号分割字符串,但忽略括号或引号中的逗号

C#正则表达式用分隔符分割行,但忽略引号内的分隔符

使用逗号分割文本,但忽略字符串中的任何字符

js split 正则表达式过滤引号中的逗号

GROOVY - 解析CSV:忽略双引号内的逗号

用逗号分割数字,忽略双引号里面的逗号