如何创建与引号外的特定文本匹配的正则表达式

时间:2015-06-24 13:38:52

标签: java regex string replace

我正在寻找一些关于创建正则表达式以帮助替换以下格式的文本的帮助:

Replace the 3 words 'OR' and 'AND' and 'NOT' with '||', '&&' and '!' respectively. 
But don't replace it if those 3 words appear somewhere within quotes.

例如,句子

PANDA OR THOR AND "NOTHING OR EVERYTHING" NOT THINKING

应改为

PANDA || THOR && "NOTHING OR EVERYTHING" ! THINKING

我使用Java API String.replaceAll(正则表达式,替换)来替换文本。

编辑:我并没有试图在一个单一的替换所有'替换所有'声明。我会一次更换一个。但我正在寻找有关正则表达式的帮助以取代它们。

2 个答案:

答案 0 :(得分:4)

由于您只有一个替代品,因此您无法在一个replaceAll中执行此操作。考虑使用正则表达式,它将找到您要替换的引号或部分。然后检查找到的匹配项是否不是引号,并将其替换为您想要的匹配项(您可以使用Matcher及其appendReplacementappendTail方法。

所以你的代码看起来像

Pattern p = Pattern.compile("\"[^\"]+\"|\\bAND\\b|\\bOR\\b|\\bNOT\\b");
//                           "quotes"      AND       OR       NOT
Matcher m = p.matcher(text);

StringBuffer sb =new StringBuffer();

while(m.find()){
    String match = m.group();

    if (match.startsWith("\"")){//it is quotation, append it without changes
        m.appendReplacement(sb, match);
    }else if(match.equals("AND")){
        m.appendReplacement(sb, "&&");
    }else //...rest of your cases
}
m.appendTail(sb);

String result = sb.toString();

答案 1 :(得分:0)

您需要编写三个replaceAll函数。

string.replaceAll("(?m)\\bOR\\b(?=(?:\"[^\"]*\"|[^\"])*$)", "||")
      .replaceAll("(?m)\\bAND\\b(?=(?:\"[^\"]*\"|[^\"])*$)", "&&")
      .replaceAll("(?m)\\bNOT\\b(?=(?:\"[^\"]*\"|[^\"])*$)", "!");