4

我需要一个 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?\"]
  • 报价总是平衡的
  • 引号可以用\"

任何帮助表示赞赏

4

2 回答 2

5

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

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:它不会处理转义的引号,例如\"

于 2013-11-04T16:52:12.747 回答
0

复活这个问题,因为它有一个没有提到的简单正则表达式解决方案。(在对正则表达式赏金任务进行一些研究时发现了您的问题。)

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

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

这是工作代码(参见在线演示):

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. 除了情况 s1、s2、s3 之外,如何匹配模式
  2. 如何匹配模式,除非...
于 2014-05-19T23:15:38.400 回答