模式与动态匹配器匹配

时间:2014-05-05 09:22:58

标签: java regex regular-language

示例输入字符串: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("${", "\\$\\{");得到错误我得到了模式语法异常

enter image description here

4 个答案:

答案 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
    ...
}