猿问

我需要澄清“缺少要转义的字符”异常

我有以下代码:


public class Test {


public static void main(String[] args) {

    String path = "${file.path}/fld/";

    String realValue = "C:\\path\\smtg\\";

    String variable = "${file.path}";

    path = path.replaceAll("\\$\\{" + variable.substring(2, variable.length() - 1) + "\\}", realValue);

    System.out.println(path);

    }

}

这给了我以下例外:


Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing

at java.util.regex.Matcher.appendReplacement(Matcher.java:809)

at java.util.regex.Matcher.replaceAll(Matcher.java:955)

at java.lang.String.replaceAll(String.java:2223)

at testCode.Test.main(Test.java:9)

我已经找到了一些关于这个问题的问题,但我仍然不明白这个错误。有人可以解释一下这是怎么回事吗?


我知道这replace会很好用,但不幸的是我的同事不想修改这段代码。所以我需要知道确切的问题来提供解决方案,因为在其他安装中它有效。


人到中年有点甜
浏览 285回答 3
3回答

蓝山帝景

ReplaceAll 将其输入视为正则表达式。正则表达式中有一些有效的转义表达式,例如\w单词字符或\s任何空格。如果file.path是包含\它的 Windows 路径,则很可能具有无效的转义序列。在任何情况下,它都不会具有您想要的含义。其他有效的情况是在类似 Unix 的环境中吗?(unix, linux, os-x 等) 如果是这样它可以工作,因为这些环境/用于路径分隔符。在打电话之前replaceAll你可以试试variable = variable.replace("\\", "\\\\"); // to escape any \ in path.

MMTTMM

replaceAll(regexString, replacementString)规则 #1:   第一个输入接受正则表达式,在您的情况下,可读性较低。规则#2:   第二个输入按原样接受用于替换的字符串文字,但根据replaceAll文档,$或\替换字符串中的字符给出的结果与预期不同,因此这会导致java.lang.IllegalArgumentException: character to be escaped is missing.解决方案片段:public class Main {   public static void main(String[] args) {      String path = "${file.path}/fld/";      String realValue = Matcher.quoteReplacement("C:\\path\\smtg");      String variable = "\\$\\{file\\.path\\}";      path = path.replaceAll(variable, realValue);      System.out.println(path);  }}
随时随地看视频慕课网APP

相关分类

Java
我要回答