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正则表达式用逗号分割字符串,但忽略引号和括号[重复]的主要内容,如果未能解决你的问题,请参考以下文章