如何拆分逗号分隔的字符串,但在Java中排除一些包含逗号的单词

时间:2014-06-19 06:38:37

标签: java regex string

假设我们有以下字符串:

"test01,test02,test03,exceptional,case,test04"

我想要的是将字符串拆分为字符串数组,如下所示:

["test01","test02","test03","exceptional,case","test04"]

我怎么能用Java做到这一点?

5 个答案:

答案 0 :(得分:6)

这种负面的外观正则表达式适用于你:

(?<!exceptional),|,(?!case)

Working Demo

Java代码:

String[] arr = str.split("(?<!exceptional),|,(?!case)");

<强>解释

此正则表达式与逗号匹配,如果这两个条件中的任何一个符合

  1. 逗号前面没有单词exceptional,使用负面的lookbehind (?<!exceptional)
  2. 使用否定前瞻case
  3. 逗号后面没有单词(?!case)

    当逗号被任意一侧的exceptionalcase包围时,实际上不允许拆分逗号。

答案 1 :(得分:1)

@anubhava's answer非常好用。完成后,这是一个适用于许多解决方案并使用一个非常简单的正则表达式的通用解决方案:

exceptional,case|(,)

交替|的左侧匹配完成exceptional,case。我们将忽略这些匹配。右侧匹配并捕获第1组的逗号,我们知道它们是正确的,因为它们与左侧的表达式不匹配。然后我们用一些独特的东西替换这些逗号,并将其拆分为该字符串。

此程序显示了如何使用正则表达式(请参阅online demo底部的结果):

 String subject = "somethingelse,case,test02,test03,exceptional,case,test04,exceptional,notcase";
Pattern regex = Pattern.compile("exceptional,case|(,)");
Matcher m = regex.matcher(subject);
StringBuffer b= new StringBuffer();
while (m.find()) {
if(m.group(1) != null) m.appendReplacement(b, "@@SplitHere@@");
else m.appendReplacement(b, m.group(0));
}
m.appendTail(b);
String replaced = b.toString();
String[] splits = replaced.split("@@SplitHere@@");
for (String split : splits) System.out.println(split);

参考

答案 2 :(得分:0)

Java如何理解exceptional,case是一个单词而不是分裂?

仍然如果有其他一些重复出现的角色,例如"",你可以将其拆分。

对于前。如果它是

"test01","test02","test03","exceptional,case","test04"

您可以使用","

拆分它

所以在你的情况下,除非你使用正则表达式,否则它是不可能的。

答案 3 :(得分:0)

这是一个简单的答案,不知道为什么我昨天没有想到它:

(?<!exceptional(?=,case)),

<强>解释

逗号(正则表达式的最后一个字符),前面没有exceptional后跟,case

答案 4 :(得分:-1)

您可能想要使用 split()

像这样:

String[] array = "test01,test02,test03,exceptional,case,test04".split(",");