gpt4 book ai didi

java - 如何使用表达式语言解析模板句 "#{name} invited you"

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:25:00 26 4
gpt4 key购买 nike

我是 Java 新手。

我的意图是在 Java 程序中使用类似句子的模板(没有 JSP 或任何 web 相关页面)

示例:

String name = "Jon";

"#{ name } invited you";

or

String user.name = "Jon";

"#{ user.name } invited you";

如果我将这个字符串传递给某个方法,我应该得到

"Jon invited you"

我经历了一些表达语言MVEL、OGNL、JSTL EL

在 MVEL 和 OGNL 中,我必须编写一些代码集来实现这一点,但采用其他方式。

我只能在 JSP 文件而不是 java 程序中使用 JSTL EL 来实现这一点。

有什么办法可以实现吗?

提前致谢。

乔恩

最佳答案

Is there any way to achieve this?

我不是 100% 确定我了解您的需求,但这里有一些提示...

看看 MessageFormat API 中的类。您可能还对 Formatter 感兴趣类和/或 String.format方法。

如果您有一些 Properties 并且您想要搜索和替换形状为 #{ property.key } 的子字符串,您也可以这样做:

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

class Test {

public static String process(String template, Properties props) {
Matcher m = Pattern.compile("#\\{(.*?)\\}").matcher(template);

StringBuffer sb = new StringBuffer();
while (m.find())
m.appendReplacement(sb, props.getProperty(m.group(1).trim()));
m.appendTail(sb);

return sb.toString();
}


public static void main(String[] args) {
Properties props = new Properties();
props.put("user.name", "Jon");
props.put("user.email", "jon.doe@example.com");

String template = "Name: #{ user.name }, email: #{ user.email }";

// Prints "Name: Jon, email: jon.doe@example.com"
System.out.println(process(template, props));
}
}

如果您有实际的 POJO 而不是 Properties 对象,您可以像这样进行反射:

import java.util.regex.*;

class User {
String name;
String email;
}


class Test {

public static String process(String template, User user) throws Exception {
Matcher m = Pattern.compile("#\\{(.*?)\\}").matcher(template);

StringBuffer sb = new StringBuffer();
while (m.find()) {
String fieldId = m.group(1).trim();
Object val = User.class.getDeclaredField(fieldId).get(user);
m.appendReplacement(sb, String.valueOf(val));
}
m.appendTail(sb);
return sb.toString();
}


public static void main(String[] args) throws Exception {
User user = new User();
user.name = "Jon";
user.email = "jon.doe@example.com";
String template = "Name: #{ name }, email: #{ email }";

System.out.println(process(template, user));
}
}

...但它变得越来越丑陋,我建议您考虑更深入地研究一些第 3 方库来解决这个问题。

关于java - 如何使用表达式语言解析模板句 "#{name} invited you",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7144906/

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