gpt4 book ai didi

java - 为什么正则表达式+分组测试失败?

转载 作者:行者123 更新时间:2023-11-29 04:52:32 25 4
gpt4 key购买 nike

我正在使用正则表达式替换模板文件中的占位符。

我有这个方法:

public static String processTemplate(String template, Map<String, String> attributes) {
Matcher m = PLACEHOLDER_PATTERN.matcher(template);
String message = template;
boolean matches = m.matches();

if (matches) {
for (int i = 1; i < m.groupCount() + 1; i++) {
message = message.replaceAll(m.group(i), attributes.get(m.group(i)));
}
}

return message;
}

使用这种模式:

    private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("(\\$\\{.*?})");

但是这个测试失败了:

@Test
public void templates() {
Map<String, String> attributes = new HashMap<>();
attributes.put("${wobble}", "wobble");
String result = processTemplate("wibble ${wobble}", attributes);
assertEquals("wibble wobble", result);
}

我也不知道为什么。似乎“匹配”返回错误。

最佳答案

这是处理正则表达式的方式:

private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("\\$\\{.*?}");

public static String processTemplate(String template, Map<String, String> attributes) {
Matcher m = PLACEHOLDER_PATTERN.matcher(template);

StringBuffer sb = new StringBuffer();
while (m.find()) {
if (attributes.containsKey(m.group()))
m.appendReplacement(sb, attributes.get(m.group()));
}
m.appendTail(sb);

return sb.toString();
}

然后称它为:

Map<String, String> attributes = new HashMap<>();
attributes.put("${wobble}", "wobble");
String result = processTemplate("wibble ${wobble}", attributes);
//=> "wibble wobble"

变化是:

  1. 使用 matcher.find() 代替 matcher.matches()
  2. 使用 matcher.appendReplacement() 将每个替换追加到缓冲区中
  3. 最后调用 matcher.appendTail() 附加剩余的文本

关于java - 为什么正则表达式+分组测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com