作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
"supplant() 对字符串进行变量替换。它扫描字符串以查找括在 { } 大括号中的表达式。如果找到表达式,则将其用作对象上的键,并且该键是否具有字符串值或数字值,它被替换为括号表达式并重复。”
更具体地说,我正在尝试做一些类似的事情:
public static String supplant(CharSequence message, Map<String,Object> params)
最佳答案
您所描述的通常称为模板。有许多模板应用程序和库,但如果您只想要一个快速而肮脏的解决方案,可以使用正则表达式轻松实现。
在许多正则表达式风格中,您将使用内置的回调或标注机制,例如 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, "")
追加出现在前一场比赛(如果有的话)和当前比赛之间的任何文本。 append()
附加它方法。 (您可以通过将替换字符串作为第二个参数传递给 appendReplacement()
来组合步骤 2 和 3,但是您必须注意字符串中的美元符号和反斜杠,它们会受到特殊处理。这种方式要简单得多。 ) appendTail(sb)
追加最后一场比赛后剩下的任何东西。 关于java - java中如何实现 "supplant",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4339247/
"supplant() 对字符串进行变量替换。它扫描字符串以查找括在 { } 大括号中的表达式。如果找到表达式,则将其用作对象上的键,并且该键是否具有字符串值或数字值,它被替换为括号表达式并重复。”
/** Supplant **/ String.prototype.supplant = function(o) { return this.replace (/{([^{}]*)}/g,
我需要创建一个类似于 Douglas Crockford 的 String.supplant 的函数: if (typeof String.prototype.supplant !== 'functi
我是一名优秀的程序员,十分优秀!