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

时间:2013-05-23 15:40:28

标签: java regex string

我坚持使用这个正则表达式。

所以,我输入了:

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

最后我想得到的是:

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

我试过正则表达式

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

如果括号内没有逗号,则可以正常工作。

4 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

不要使用正则表达式。编写一个简单的解析器,跟踪遇到的括号数,以及是否在引号内。有关详细信息,请参阅:RegEx match open tags except XHTML self-contained tags

答案 2 :(得分:0)

这会做你需要的吗?

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

答案 3 :(得分:0)

假设()()不可能嵌套\"""内没有可能(例如)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()]); } ,你可以这样写:

{{1}}

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