Java 如何用方法值替换字符串?
我有一个来自API或存储在数据库中的字符串,我想在运行时用我的标记替换所有标记。有什么有效的方法来实现这一点吗 使用Java 如何用方法值替换字符串?,java,Java,我有一个来自API或存储在数据库中的字符串,我想在运行时用我的标记替换所有标记。有什么有效的方法来实现这一点吗 使用if-else是无效的,因为我的模型有100多个字段 String rawText= "Hello %name% !, Nice to meet you! Your age is %age%." 我想用我的模型中存储的值替换所有%\uuuuuuuuuuuuuuuuuuuuuuuuuuuu%文本 class Person{ private String name;
if-else
是无效的,因为我的模型有100多个字段
String rawText= "Hello %name% !, Nice to meet you! Your age is %age%."
我想用我的模型中存储的值替换所有%\uuuuuuuuuuuuuuuuuuuuuuuuuuuu%
文本
class Person{
private String name;
private String age;
getter...
setter....
}
您可以使用replaceAll
String rawText= "Hello %name% !, Nice to meet you! Your age is %age%.";
rawText = rawText.replaceAll("%name%", "new name");
rawText = rawText.replaceAll("%age%", "new age");
新名称和新时代可以来自您的模型。您可以使用replaceAll
String rawText= "Hello %name% !, Nice to meet you! Your age is %age%.";
rawText = rawText.replaceAll("%name%", "new name");
rawText = rawText.replaceAll("%age%", "new age");
新名称和新时代可以来自您的模型。我看不出任何原因说明常规字符串连接在这里是不够的。只需在
Person
中定义一个helper方法,该方法使用给定Person的属性构建输出字符串:
public class Person {
// ...
public String getGreeting() {
StringBuilder sb = new StringBuilder("");
sb.append("Hello ").append(name).append(", nice to meet you! Your age is ");
sb.append(age).append(".");
return sb.toString();
}
}
我看不出任何理由说明常规字符串连接在这里是不够的。只需在
Person
中定义一个helper方法,该方法使用给定Person的属性构建输出字符串:
public class Person {
// ...
public String getGreeting() {
StringBuilder sb = new StringBuilder("");
sb.append("Hello ").append(name).append(", nice to meet you! Your age is ");
sb.append(age).append(".");
return sb.toString();
}
}
您可以使用反射按名称获取字段值:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String replaceTags(String rawText) {
Matcher m = Pattern.compile("%(.+?)%").matcher(rawText);
boolean result = m.find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
m.appendReplacement(sb, Matcher.quoteReplacement(getField(m.group(1))));
result = m.find();
} while (result);
m.appendTail(sb);
return sb.toString();
}
return rawText.toString();
}
private String getField(String name) {
try {
return String.valueOf(this.getClass().getDeclaredField(name).get(this));
} catch (Exception e) {
throw new IllegalArgumentException("could not read value for field: " + name);
}
}
}
如果您使用的是Java 9,则可以使用替换函数简化replaceTags()
:
public String replaceTags(String rawText) {
return Pattern.compile("%(.+?)%").matcher(rawText)
.replaceAll(r -> Matcher.quoteReplacement(getField(r.group(1))));
}
如果您有类似Jackson的JSON序列化库,则可以使用它自动处理反射并按字段名构建值映射:
Map<String, Object> fieldValues = new ObjectMapper()
.convertValue(this, new TypeReference<Map<String, Object>>() {});
Map fieldValues=new ObjectMapper()
.convertValue(这是新的TypeReference(){});
您可以使用反射按名称获取字段值:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String replaceTags(String rawText) {
Matcher m = Pattern.compile("%(.+?)%").matcher(rawText);
boolean result = m.find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
m.appendReplacement(sb, Matcher.quoteReplacement(getField(m.group(1))));
result = m.find();
} while (result);
m.appendTail(sb);
return sb.toString();
}
return rawText.toString();
}
private String getField(String name) {
try {
return String.valueOf(this.getClass().getDeclaredField(name).get(this));
} catch (Exception e) {
throw new IllegalArgumentException("could not read value for field: " + name);
}
}
}
如果您使用的是Java 9,则可以使用替换函数简化replaceTags()
:
public String replaceTags(String rawText) {
return Pattern.compile("%(.+?)%").matcher(rawText)
.replaceAll(r -> Matcher.quoteReplacement(getField(r.group(1))));
}
如果您有类似Jackson的JSON序列化库,则可以使用它自动处理反射并按字段名构建值映射:
Map<String, Object> fieldValues = new ObjectMapper()
.convertValue(this, new TypeReference<Map<String, Object>>() {});
Map fieldValues=new ObjectMapper()
.convertValue(这是新的TypeReference(){});
使用反射,只需几行代码即可完成:
import java.lang.reflect.Field;
public class Main {
public static void main(String arg[]) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException {
String rawText= "Hello %name% !, Nice to meet you! Your age is %age%.";
Field[] fields = Person.class.getFields();
Person person = new Person("TestName", "TestAge");
for(Field field: fields) {
rawText = rawText.replace("%"+field.getName()+"%", (String)field.get(person));
}
}
}
只需在Person类中公开这些字段。使用反射,只需几行代码即可:
import java.lang.reflect.Field;
public class Main {
public static void main(String arg[]) throws ClassNotFoundException, IllegalArgumentException, IllegalAccessException {
String rawText= "Hello %name% !, Nice to meet you! Your age is %age%.";
Field[] fields = Person.class.getFields();
Person person = new Person("TestName", "TestAge");
for(Field field: fields) {
rawText = rawText.replace("%"+field.getName()+"%", (String)field.get(person));
}
}
}
只需将字段在Person类中公开即可。您尝试了什么?听说过连接吗?您使用的是什么版本的Java?您是否碰巧使用了Jackson或Gson?Jaction或Gson将json转换为Java对象,但不是json。此外,我并没有尝试将json转换为java对象。从文本中查找模式(%age%)不是一个问题,而是从模型中获取年龄,其中公共方法是getAge()。我理解您试图做什么。请回答问题。你试过什么?听说过连接吗?您使用的是什么版本的Java?您是否碰巧使用了Jackson或Gson?Jaction或Gson将json转换为Java对象,但不是json。此外,我并没有尝试将json转换为java对象。从文本中查找模式(%age%)不是一个问题,而是从模型中获取年龄,其中公共方法是getAge()。我理解您试图做什么。请回答问题。除非您需要regex.true replaceAll for regex,否则请使用
replace()
。这里应该是replace。使用replace()
除非您需要regex.true replaceAll for regex。我喜欢这个解决方案,我认为在正则表达式中使用“%(\w+”)可以处理空%%%我喜欢这个解决方案,我认为在正则表达式中使用“%(\w+””可以处理空%%%谢谢你的回答,但我的用例不符合答案,因为我不知道原始文本是什么,它可以是任何带有标签的文本,如..%age%@NandanSingh好的…我将把这篇文章留在这里,以防它对其他人有用。谢谢你的回答,但我的用例不符合答案,因为我不知道什么是原始文本,它可以是任何带有标签的文本,如..%age%@NandanSingh好的…我将把这篇文章留在这里,以防对其他人有用。此解决方案不使用正则表达式。改为使用String.replace()
。@Tom它使用一个需要正则表达式的方法,但传入的值是纯文本,实际上可能是无效的正则表达式。我所做的也可以在没有正则表达式的情况下完成,纯文本也可以被视为正则表达式。是的,它可能是无效的,但根据java命名约定[camel case],它不应该是无效的。@shmosel我刚刚回答了与问题相关的问题,我没有看到任何字段将有base64字符串,它只是一些名称、年龄或任何人拥有的属性。纯文本也可以被视为regex。通常不会a$
是有效的字段名。看看如果您尝试将其替换为正则表达式会发生什么。此解决方案不使用正则表达式。改为使用String.replace()
。@Tom它使用一个需要正则表达式的方法,但传入的值是纯文本,实际上可能是无效的正则表达式。我所做的也可以在没有正则表达式的情况下完成,纯文本也可以被视为正则表达式。是的,它可能是无效的,但根据java命名约定[camel case],它不应该是无效的。@shmosel我刚刚回答了与问题相关的问题,我没有看到任何字段将有base64字符串,它只是一些名称、年龄或任何人拥有的属性。纯文本也可以被视为regex。通常不会a$
是有效的字段名。看看如果您尝试将其替换为正则表达式会发生什么。