正则表达式替换不在引号内的字符串(单或双)
问题内容:
我有一个输入字符串
这个或“那个或”或“这个或那个”
应该翻译成
这个|| “那个或” || “这个或那个”
因此,尝试是在一个字符串中查找一个字符串(或)的出现并将其替换为另一个字符串(||)。我尝试了以下代码
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)*[^\"']*$)", "||");