gpt4 book ai didi

java - java中如何实现 "supplant"

转载 作者:行者123 更新时间:2023-12-04 06:40:20 24 4
gpt4 key购买 nike

"supplant() 对字符串进行变量替换。它扫描字符串以查找括在 { } 大括号中的表达式。如果找到表达式,则将其用作对象上的键,并且该键是否具有字符串值或数字值,它被替换为括号表达式并重复。”

更具体地说,我正在尝试做一些类似的事情:

public static String supplant(CharSequence message, Map<String,Object> params)

我正在尝试使用像\{([\w]*)\} 这样的正则表达式来捕获变量,然后查找 map 并替换,但我无法编写匹配的正则表达式...

你将如何在 Java 中实现 supplant()?

最佳答案

您所描述的通常称为模板。有许多模板应用程序和库,但如果您只想要一个快速而肮脏的解决方案,可以使用正则表达式轻松实现。

在许多正则表达式风格中,您将使用内置的回调或标注机制,例如 PHP 的 preg_replace_callback函数,或 Perl 的 /e/ee修饰符。 Java 没有类似的东西,但它提供了 API 来让你自己实现它。下面是一个例子:

import java.util.*;
import java.util.regex.*;

public class Test
{
public static void main(String[] args) throws Exception
{
String s = "Lorem ipsum {foo} impedit civibus ei pri, legimus\n" +
"antiopam no {marco}, quo id everti forensibus maiestatis.";
Map<String,Object> p = new HashMap<String,Object>()
{{
put("foo", "BAR");
put("marco", "POLO!");
}};
System.out.printf("%s%n%n%s%n", s, supplant(s, p));
}

public static CharSequence supplant(CharSequence message, Map<String,Object> params)
{
Matcher m = Pattern.compile("\\{(\\w+)\\}").matcher(message);
StringBuffer sb = new StringBuffer();
while (m.find())
{
m.appendReplacement(sb, "");
String key = m.group(1);
sb.append(params.get(key).toString());
}
m.appendTail(sb);
return sb.toString();
}
}

显然,这段代码遗漏了一些基本组件(主要是异常处理),但它展示了该技术的要点:
  • 使用括号捕获大括号内的内容,然后通过调用 group(1) 访问它在匹配器上。
  • 使用 appendReplacement(sb, "")追加出现在前一场比赛(如果有的话)和当前比赛之间的任何文本。
  • 查找替换并使用 StringBuffer 的 append() 附加它方法。 (您可以通过将替换字符串作为第二个参数传递给 appendReplacement() 来组合步骤 2 和 3,但是您必须注意字符串中的美元符号和反斜杠,它们会受到特殊处理。这种方式要简单得多。 )
  • 使用 appendTail(sb)追加最后一场比赛后剩下的任何东西。

  • 有几个人发布了帮助类,让您无需编写所有样板代码即可完成此类任务。我最喜欢的是 Elliott Hughes 的 Rewriter .

    关于java - java中如何实现 "supplant",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339247/

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