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


问题内容

我有一个输入字符串

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

应该翻译成

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

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

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

输出是

这个|| “那个或” || ‘这个|| 那’

问题是单引号内的字符串也被替换了。至于代码,样式仅是示例。当我开始工作时,我将编译模式并重用它。


问题答案:

试试这个正则表达式:-

"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)*[^\"']*$)", "||");