Java 如何实施";取代;在爪哇

Java 如何实施";取代;在爪哇,java,regex,substitution,Java,Regex,Substitution,replacement()对字符串进行变量替换。它扫描字符串,查找{}大括号中包含的表达式。如果找到表达式,请将其用作对象上的键,如果该键有字符串值或数值,则将其替换为大括号表达式并重复 更具体地说,我想做一些事情,比如: public static String supplant(CharSequence message, Map<String,Object> params) 公共静态字符串替换(CharSequence消息,映射参数) 我试图使用像\{([\w]*)\}这样的

replacement()对字符串进行变量替换。它扫描字符串,查找{}大括号中包含的表达式。如果找到表达式,请将其用作对象上的键,如果该键有字符串值或数值,则将其替换为大括号表达式并重复

更具体地说,我想做一些事情,比如:

public static String supplant(CharSequence message, Map<String,Object> params)
公共静态字符串替换(CharSequence消息,映射参数)
我试图使用像\{([\w]*)\}这样的正则表达式来捕获变量,然后查找映射并替换,但我无法编写匹配的正则表达式


您将如何在java中实现replacement()?Java已经有了将变量替换为字符串的内置方法

见:


您描述的是更常见的模板。有很多模板化应用程序和库,但是如果您只是想要一个快速而肮脏的解决方案,那么可以使用正则表达式轻松地实现它

在许多正则表达式风格中,您将使用内置回调或调出机制,如PHP的
preg\u replace\u回调
函数,或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();
  }
}
import java.util.*;
导入java.util.regex.*;
公开课考试
{
公共静态void main(字符串[]args)引发异常
{
字符串s=“Lorem ipsum{foo}妨碍civibus ei pri,legimus\n”+
“安蒂奥帕姆不{marco},我是埃弗蒂法医。”;
Map p=newhashmap()
{{
put(“foo”、“BAR”);
放(“马可”,“波罗!”);
}};
System.out.printf(“%s%n%n%s%n”,s,替换项(s,p));
}
公共静态CharSequence替换(CharSequence消息,映射参数)
{
Matcher m=Pattern.compile(“\\{(\\w+\\\}”).Matcher(消息);
StringBuffer sb=新的StringBuffer();
while(m.find())
{
m、 (b)以“”号填列;
字符串键=m.group(1);
sb.append(params.get(key.toString());
}
m、 (某人);
使某人返回字符串();
}
}
显然,此代码省略了一些基本组件(主要是异常处理),但它演示了此技术的要点:

  • 使用括号捕获大括号内的内容,然后通过调用Matcher上的
    group(1)
    访问它
  • 使用
    appendReplacement(sb,”)
    附加上一个匹配(如果有)和当前匹配之间出现的任何文本
  • 查找替换项并使用StringBuffer的
    append()
    方法将其追加。(您可以通过将替换字符串作为第二个参数传递给
    appendReplacement()
    ,将步骤2和步骤3结合在一起,但是您必须注意字符串中的美元符号和反斜杠,它们会受到特殊处理。这种方法简单得多。)
  • 使用
    appendTail(sb)
    追加上次匹配后剩余的内容
  • 一些人已经发布了帮助器类,让您无需编写所有样板代码即可完成此类任务。我最喜欢的是艾略特·休斯的