Java 基于动态匹配器的模式匹配

Java 基于动态匹配器的模式匹配,java,regex,regular-language,Java,Regex,Regular Language,示例输入字符串:Customer${/xml:Name}已订购了${/xml:Product}个${/xml:unit}单元的产品${/xml:Product} 我可以使用\\$\{.*.\}找到与${……}匹配的get字符串 我从xml解析字符串的值,现在必须将该值替换回输入字符串 我用这个方法, Pattern MY_PATTERN = Pattern.compile("\\$\\{.*?\\}"); Matcher m = MY_PATTERN.matcher(inputstring);

示例输入字符串:Customer${/xml:Name}已订购了${/xml:Product}个${/xml:unit}单元的产品${/xml:Product}

我可以使用\\$\{.*.\}找到与${……}匹配的get字符串

我从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${,\\$\{处得到了错误;我得到了模式语法异常

您必须转义{too,try$\{

您必须转义{too,try$\{

而不是:

s = s.replaceAll("${", "\\$\\{");  // s is \$\{/xml:Name}
s = s.replaceAll("}", "\\}"); // s is  \$\{/xml:Name\}
您可以在不使用正则表达式方法Stringreplacestring的情况下使用它:

而不是:

s = s.replaceAll("${", "\\$\\{");  // s is \$\{/xml:Name}
s = s.replaceAll("}", "\\}"); // s is  \$\{/xml:Name\}
您可以在不使用正则表达式方法Stringreplacestring的情况下使用它:


这是因为你可以有一个类似regexp的{1,4}意思是匹配a,aa,aaa,aaaa,所以a乘以1到4,java试图像这样解释你的regexp,因此尝试逃逸{

这是因为你可以有一个类似regexp的{1,4}意味着匹配a,aa,aaa,aaaa,所以a乘以1到4,java试图像这样解释您的regexp,因此尝试转义{

是的,您必须转义{,但我更愿意捕获大括号内的内容:

Pattern MY_PATTERN = Pattern.compile("\\$\\{/xml:(.*?)\\}");
Matcher m = MY_PATTERN.matcher(inputstring);
while (m.find()) {
    name = m.group(1); // s is Name
    ...
}

是的,你必须逃离{,但我更愿意捕捉括号内的内容:

Pattern MY_PATTERN = Pattern.compile("\\$\\{/xml:(.*?)\\}");
Matcher m = MY_PATTERN.matcher(inputstring);
while (m.find()) {
    name = m.group(1); // s is Name
    ...
}