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“无法”“请注意,我们将转义另一个字符。也就是说,如果您用codeString 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作为参数,因此不需要任何转义。