我正在寻找一些关于创建正则表达式以帮助替换以下格式的文本的帮助:
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(正则表达式,替换)来替换文本。
编辑:我并没有试图在一个单一的替换所有'替换所有'声明。我会一次更换一个。但我正在寻找有关正则表达式的帮助以取代它们。
答案 0 :(得分:4)
由于您只有一个替代品,因此您无法在一个replaceAll
中执行此操作。考虑使用正则表达式,它将找到您要替换的引号或部分。然后检查找到的匹配项是否不是引号,并将其替换为您想要的匹配项(您可以使用Matcher
及其appendReplacement
和appendTail
方法。
所以你的代码看起来像
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(?=(?:\"[^\"]*\"|[^\"])*$)", "!");