如何正确将字符串中的运算符替换为其对立运算符?
这个问题我太熟悉了——顺序替换运算符的时候,刚替换好的符号会被后续的替换操作"改回去",这就是你遇到的坑!
先说说为什么你的方法不行:你先把所有+换成-,这时候原字符串里的+=变成了-=,同时原有的3 - (2还是3 - (2。但接下来你把所有-换成+,这会把刚生成的-=里的-和原来的减号一起替换成+,结果-=又变回了+=,这就和预期不符了。
下面给你两种靠谱的解决方案:
方案1:用临时占位符避免冲突
思路是先把容易被覆盖的符号换成临时的、不会和其他运算符冲突的字符串,等其他替换完成后再换回来。以Java为例:
String original = "value += 5 * 3 - (2 / 4)"; // 先处理加减:避免+和-互相干扰 String tempMinus = original.replaceAll("-", "TEMP_MINUS"); // 把所有减号换成临时标记 String swapPlusMinus = tempMinus.replaceAll("\\+", "-"); // 把加号换成减号 String fixedPlusMinus = swapPlusMinus.replaceAll("TEMP_MINUS", "+"); // 把临时标记换回加号 // 再处理乘除:同样避免*和/互相干扰 String tempDiv = fixedPlusMinus.replaceAll("/", "TEMP_DIV"); String finalResult = tempDiv.replaceAll("\\*", "/").replaceAll("TEMP_DIV", "*"); System.out.println(finalResult); // 输出:value -= 5 / 3 + (2 * 4)
注意:+和*是正则表达式的特殊字符,所以要加\转义(Java里需要写两个\\),或者用Pattern.quote("+")来安全匹配原符号,避免正则语法错误。
方案2:用正则匹配+回调替换(更高效)
直接一次性匹配所有运算符,然后根据每个运算符的类型替换成对应的对立符号,只需要遍历一次字符串,逻辑更清晰。还是Java的示例:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class OperatorSwap { public static void main(String[] args) { String original = "value += 5 * 3 - (2 / 4)"; // 匹配所有运算符:+ - * /(注意-在字符类里转义或放在末尾) Pattern opPattern = Pattern.compile("[+\\-*/]"); Matcher matcher = opPattern.matcher(original); StringBuilder result = new StringBuilder(); while (matcher.find()) { String currentOp = matcher.group(); // 根据当前运算符替换成对立符号 switch (currentOp) { case "+": matcher.appendReplacement(result, "-"); break; case "-": matcher.appendReplacement(result, "+"); break; case "*": matcher.appendReplacement(result, "/"); break; case "/": matcher.appendReplacement(result, "*"); break; } } matcher.appendTail(result); // 把最后一段非匹配的内容加进去 System.out.println(result.toString()); // 输出:value -= 5 / 3 + (2 * 4) } }
如果是JavaScript,思路完全一致,用replace方法带回调函数即可:
const original = "value += 5 * 3 - (2 / 4)"; const result = original.replace(/[+\-*/]/g, op => { switch(op) { case '+': return '-'; case '-': return '+'; case '*': return '/'; case '/': return '*'; default: return op; } }); console.log(result); // 输出 value -= 5 / 3 + (2 * 4)
内容的提问来源于stack exchange,提问作者Morchul
相关产品推荐
相关产品推荐

