Java 交换转义字符

Java 交换转义字符,java,escaping,Java,Escaping,我试图交换字符串A*(B+C)/D中的括号,但是交换它们会导致A*\)B+C(/D而不是A*)B+C(/D) public class InfixToPrefixExpression { private String swapStrings(String expression, String one, String two){ return Arrays.stream(expression.split(one, -1))

我试图交换字符串
A*(B+C)/D
中的括号,但是交换它们会导致
A*\)B+C(/D
而不是
A*)B+C(/D

public class InfixToPrefixExpression {
        private String swapStrings(String expression, String one, String two){
    
            return Arrays.stream(expression.split(one, -1))
                         .map(s -> s.replaceAll(two, one))
                         .collect(Collectors.joining(two));
        }
        public static void main(String[] args) {
            String expression = "A * (B + C) / D";
            String result = new InfixToPrefixExpression().swapStrings(expression,
                             "\\(","\\)");
            System.out.println(result);
        }
}
如何删除结果字符串中出现的额外反斜杠?我也尝试了以下方法,但string.join()方法在结果中添加了额外的斜杠

//        String[] split = expression.split(one, -1);
//        for (int i = 0; i < split.length; i++) {
//            split[i] = split[i].replaceAll(two, one);
//        }
//        String result = String.join(two, split);
//String[]split=expression.split(一,-1);
//对于(int i=0;i
一种简单的交换方法可能是交换
”(“
交换一个特殊字符,如
”,然后交换
交换
”(“
最后交换
交换
”)
如下:

    final String expression = "A * (B + C) / D";
    final String result = expression
            .replace("(", "_")
            .replace(")", "(")
            .replace("_", ")");
    final String expression = "A * (B + C) / D";

    final String[] substrings = expression.split("\\(");
    final List<String> replacedSubstrings = new ArrayList<>();
    for (String substring : substrings) {
        replacedSubstrings.add(substring.replace(")","("));
    }

    final String result = String.join(")", replacedSubstrings);
如果不想使用特殊字符,可以使用如下方法将表达式拆分为一个括号:

    final String expression = "A * (B + C) / D";
    final String result = expression
            .replace("(", "_")
            .replace(")", "(")
            .replace("_", ")");
    final String expression = "A * (B + C) / D";

    final String[] substrings = expression.split("\\(");
    final List<String> replacedSubstrings = new ArrayList<>();
    for (String substring : substrings) {
        replacedSubstrings.add(substring.replace(")","("));
    }

    final String result = String.join(")", replacedSubstrings);
final String expression=“A*(B+C)/D”;
最后一个字符串[]子字符串=expression.split(“\\(”);
final List replacedSubstrings=new ArrayList();
for(字符串子字符串:子字符串){
replacedSubstrings.add(substring.replace(“)”,“(”);
}
最终字符串结果=String.join(“)”,replacedSubstrings);

您可能需要提供在正则表达式和
收集器中使用的特殊值。加入

私有静态字符串交换(字符串表达式、字符串1、字符串2){
字符串reOne=“\\”+1;
字符串reTwo=“\\”+2;
返回Arrays.stream(expression.split(reOne,-1))
.map(s->s.replaceAll(reTwo,一个))
.收集(收集器。连接(两个));
}
然后可以在不转义括号的情况下调用此方法:

String expression=“A*(B+C)/D”;
字符串结果=交换字符串(表达式“(”,”);
系统输出打印项次(结果);
输出:

A * )B + C( / D

谢谢。为什么使用转义大括号-swapstring(表达式“\(”,“\)”)调用函数时行为会发生变化?Intellij还抱怨在使用修改后的代码时出现了“非法/不支持的转义序列”,但它编译成功。您好,
“\(”中关于“非法/不支持的转义序列”的错误
很明显,有一组有限的字符用作:`\n\t\r\b\f\\\\\\\\\\`。出现IntelliJ警告是因为此IDE检查字符串是否将在正则表达式中使用(参数为
split
),如果\\未正确转义,则可能不正确。而IDE“无法”“请注意,我们将转义另一个字符。也就是说,如果您用code
String reOne=“\\(”;
替换,则此警告已消失。糟糕的是,这里有两个问题:1.当原始代码执行基本相同的操作时,为什么行为会有所不同。(想想我前面评论中复制的代码被弄乱了)?2.Intellij抱怨语句
String reOne=“\\”+one;”
,尽管它编译正常。1.在regexp(如
split
)中,括号必须转义,额外\\由regexp引擎使用;在纯字符串(String.join/Collectors.joining)中,括号不需要转义,\\s不被使用-这就是为什么在原始代码中有额外的\\。2.IntelliJ有自己的功能来检查regexp可能出现的问题,而Java编译器不关心这个问题。谢谢。我想知道为什么不需要转义
子字符串中的大括号。replace()
String.join()
函数?我显然遗漏了一个微妙的地方。String#split的参数是一个正则表达式(),在正则表达式中,括号有特殊的含义,因此必须对其进行转义。还必须转义转义字符,以便Java不会解释
\(
作为特殊字符。另一方面,String#replace使用CharSequence作为参数,因此不需要任何转义。