【问题标题】:Java regex split string by comma but ignore quotes and also parentheses [duplicate]Java正则表达式用逗号分割字符串,但忽略引号和括号[重复]
【发布时间】: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 我希望它是重复的。我花了两个多小时试图在这里找到解决方案。我已经考虑过这个问题。

标签: java regex string


【解决方案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()]);
    }
    

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

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 2017-04-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2012-10-30
      相关资源
      最近更新 更多