示例输入字符串:Customer ${/xml:Name} has Ordered Product ${/xml:product} of ${/xml:unit} units.
我能够使用"\\$\\{.*?\\}"
我从xml解析字符串的值,现在我必须在输入字符串中替换该值。
我正在使用这种方法,
Pattern MY_PATTERN = Pattern.compile("\\$\\{.*?\\}");
Matcher m = MY_PATTERN.matcher(inputstring);
while (m.find()) {
String s = m.group(0); // s is ${/xml:Name}
// escaping wild characters
s = s.replaceAll("${", "\\$\\{"); // s is \$\{/xml:Name}
s = s.replaceAll("}", "\\}"); // s is \$\{/xml:Name\}
Pattern inner_pattern = Pattern.compile(s);
Matcher m1 = inner_pattern.matcher(inputstring);
name = m1.replaceAll(xPathValues.get(s));
}
但我在s = s.replaceAll("${", "\\$\\{");
得到错误我得到了模式语法异常
答案 0 :(得分:2)
您也必须逃避{
,尝试$\\{
答案 1 :(得分:1)
而不是:
s = s.replaceAll("${", "\\$\\{"); // s is \$\{/xml:Name}
s = s.replaceAll("}", "\\}"); // s is \$\{/xml:Name\}
您可以在没有正则表达式方法String#replace(string)
的情况下使用它:
s = s.replace("${", "\\$\\{").replace("}", "\\}"); // s is \$\{/xml:Name\}
答案 2 :(得分:1)
这是因为你可以有一个像a{1,4}
这样的正则表达式匹配a,aa,aaa,aaaa所以1到4次,java试图像这样解释你的正则表达式,因此试着逃避{
答案 3 :(得分:0)
是的,你必须逃避{,但我宁愿捕捉到大括号内的内容:
Pattern MY_PATTERN = Pattern.compile("\\$\\{/xml:(.*?)\\}");
Matcher m = MY_PATTERN.matcher(inputstring);
while (m.find()) {
name = m.group(1); // s is Name
...
}