Java 按顺序将匹配项替换为项目

Java 按顺序将匹配项替换为项目,java,regex,replace,java-8,java-stream,Java,Regex,Replace,Java 8,Java Stream,我在Java中有一个字符串,它包含许多模式。根据顺序,字符串中的每个模式都需要替换一个值数组。下面是该方法应该做的示例 public static String replaceValues(String withPattern, String... params){ Matcher matcher = Pattern.compile("\\{\\}").matcher(withPattern); StringBuffer sb = new StringBuff

我在Java中有一个字符串,它包含许多模式。根据顺序,字符串中的每个模式都需要替换一个值数组。下面是该方法应该做的示例

public static String replaceValues(String withPattern, String... params){
    Matcher matcher = Pattern.compile("\\{\\}").matcher(withPattern);
    StringBuffer sb = new StringBuffer();
    int index =0;
    while (matcher.find()) {
        if (args.length == index) {
            matcher.appendTail(sb);
            return sb.toString();
        }
        matcher.appendReplacement(sb, params[index]);
        index++;
    }
    return sb.toString();
}
这很有效。我只是想知道是否有一种更有效的方法来编写此代码,而不是过于声明。

您可以反复使用,逐个连续替换每个参数

public static String replaceValues(String withPattern, String... params){
    String string = withPattern;
    for (String param: params) {
        string = string.replaceFirst("\\{}", param);
    }
    return string;
}
因为和您可以使用
withPattern
T identity
的方法实现相同的功能

public static String replaceValues(String withPattern, String... params){
    return Arrays.stream(params).reduce(
            withPattern, 
            (pattern, param) -> pattern.replaceFirst("\\{}", param));
}

您还可以通过给
%s
而不是
{}
来欺骗
String.format
(但如果这一方面对您的应用程序至关重要,建议测试性能):

试试这个

static final Pattern PAT = Pattern.compile("\\{}");

static String replaceValues(String withPattern, String... parms) {
    Iterator<String> p = List.of(parms).iterator();
    return PAT.matcher(withPattern).replaceAll(m -> p.next());
}


@org.junit.jupiter.api.Test
void testFormat() {
System.out.println(replaceValues(
    "A quick brown {} jumps over the lazy {}" , "fox", "dog"));
输出

A quick brown fox jumps over the lazy dog

数组
值定义在哪里?当参数和模式的数量不相同时,这不会有问题吗?@Apps如果值少于占位符,就会出现异常,这是显而易见的。如果
with pattern
包含
%
static final Pattern PAT = Pattern.compile("\\{}");

static String replaceValues(String withPattern, String... parms) {
    Iterator<String> p = List.of(parms).iterator();
    return PAT.matcher(withPattern).replaceAll(m -> p.next());
}


@org.junit.jupiter.api.Test
void testFormat() {
System.out.println(replaceValues(
    "A quick brown {} jumps over the lazy {}" , "fox", "dog"));
System.out.println(replaceValues(
    "A quick brown {} jumps over the lazy {}" , "fox", "dog"));
A quick brown fox jumps over the lazy dog