Java RegEx查找,除非在引号之间

时间:2013-11-04 15:37:15

标签: java regex split quotes

我需要Java RegEx来拆分,或者在字符串中查找内容,但是要排除双引号之间的内容。我现在做的是:

String withoutQuotes = str.replaceAll("\\\".*?\\\"", "placeholder");
withoutQuotes = withoutQuotes.replaceAll(" ","");

但这对indexOf不起作用,我还需要能够拆分,例如:

String str = "hello;world;how;\"are;you?\""
String[] strArray = str.split(/*some regex*/);
// strArray now contains: ["hello", "world", "how", "\"are you?\"]
  • 报价始终保持平衡
  • 引号可以使用\"
  • 进行转义

感谢任何帮助

2 个答案:

答案 0 :(得分:4)

好的,这是一个适合你的代码:

String str = "a \"hello world;\";b \"hi there!\"";
String[] arr = str.split(";(?=(([^\"]*\"){2})*[^\"]*$)");
System.out.println(Arrays.toString(arr));

如果后面跟着偶数个双引号(这意味着;在引号之外),这个正则表达式会找到一个分号。

<强>输出:

[a "hello world;", b "hi there!"]

PS:它不会处理像\"

这样的转义引号

答案 1 :(得分:0)

恢复这个问题,因为它有一个简单的正则表达式解决方案,没有提到。 (在为regex bounty quest进行一些研究时找到了您的问题。)

\"[^\"]*\"|(;)

交替的左侧匹配完整的引用字符串。我们将忽略这些匹配。右侧与第1组匹配并捕获分号,我们知道它们是正确的分号,因为它们与左侧的表达式不匹配。

以下是工作代码(请参阅online demo):

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "hello;world;how;\"are;you?\"";
Pattern regex = Pattern.compile("\"[^\"]*\"|(;)");
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);
} // end main
} // end Program

参考

  1. How to match pattern except in situations s1, s2, s3
  2. How to match a pattern unless...