正则表达式替换不在引号内的字符串(单引号或双引号)

时间:2012-12-06 08:45:32

标签: java regex

我有一个输入字符串

  

this或“that or”或'this or that'

应该翻译成

  

这个|| “那或”|| “这或那个”

因此尝试在字符串中查找字符串(或)的出现并将其替换为另一个字符串(||)。我试过以下代码

Pattern.compile("( or )(?:('.*?'|\".*?\"|\\S+)\\1.)*?").matcher("this or \"that or\" or 'this or that'").replaceAll(" || ")

输出

  

这个|| “那或”|| '这||那

问题是单引号中的字符串也被替换了。 至于代码,样式只是一个例子。我会编译模式并在我开始工作时重复使用它。

1 个答案:

答案 0 :(得分:10)

试试这个正则表达式: -

"or(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)"

匹配or,后跟任意字符,后跟一定数量的 "',后跟任意字符,直到端。

String str = "this or \"that or\" or 'this or that'";
str = str.replaceAll("or(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)", "||");        
System.out.println(str);

输出: -

this || "that or" || 'this or that'

如果您与or"不匹配,则上述正则表达式也会替换'

例如: -

"this or \"that or\" or \"this or that'"

它也会替换上述字符串的or。如果您希望在上述情况下不替换它,可以将正则表达式更改为: -

str = str.replaceAll("or(?=(?:[^\"']*(\"|\')[^\"']*\\1)*[^\"']*$)", "||");