5

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

所以,我输入为:

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

最后我想得到的是:

  • "起重机装置,(物理对象)"(X1,x2,x4)
  • 不是“研究护士看到的(发现)”
  • 整个髌骨结构(X1,X8)
  • "Besnoitia wallacei (有机体)"
  • "Catatropis (有机体)"(X1,x2,x4)
  • 不是 IntracebralRouteQualifierValue
  • "Diospyros virginiana (有机体)"(X1,x2,x4)
  • 不缝合手部程序(X1)

我试过正则表达式

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

如果括号内没有逗号,它会起作用。

4

4 回答 4

3

正则表达式

(\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)
于 2013-05-23T16:02:38.873 回答
1

不要为此使用正则表达式。编写一个简单的解析器来跟踪遇到的括号数,以及您是否在引号内。有关详细信息,请参阅: RegEx 匹配打开的标签,XHTML 自包含标签除外

于 2013-05-23T15:45:15.727 回答
0

这会做你需要的吗?

System.out.println(yourString.replaceAll(", not", "\nnot"));
于 2013-05-23T15:48:09.300 回答
0

假设不可能嵌套()within (),也不可能(比如)\"inside "",您可以编写如下内容:

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

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

于 2013-05-23T15:51:03.110 回答