2012-12-06 150 views
4

我有一个输入字符串正则表达式替换字符串没有引号(单人或双人)

这样或内“即或”或者“这个或那个”

应该被翻译成

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

因此,尝试查找字符串中的字符串(或)并将其替换为另一个字符串(||)。我曾尝试下面的代码

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

输出是

此|| “那或”|| '这||那'

问题是单引号内的字符串也被替换。 对于代码,风格仅仅是一个例子。我将编译这个模式并在我使用它的时候重用它。

+0

你需要避免在单或双引号检查 - 如果你想让它不是在上述情况下更换,可以正则表达式改变。 – Fyre

回答

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,如果你有"'不匹配。

对于e.g: -

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

它将取代or对上述字符串也。在您的正则表达式模式尝试添加[^']:

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

作品,辉煌!看起来像正则表达式就像魔术一样是一门艺术 – Scorpion