Java 如何用方法值替换字符串?

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;

我有一个来自API或存储在数据库中的字符串,我想在运行时用我的标记替换所有标记。有什么有效的方法来实现这一点吗

使用
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$
是有效的字段名。看看如果您尝试将其替换为正则表达式会发生什么。