Java 7 中的 Regex-replace-with-function-evaluation 相当于什么?

2022-09-01 12:47:38

我正在寻找一种非常简单的方法来获得类似于以下JavaScript代码的东西。也就是说,对于每个匹配项,我想调用某个转换函数,并将结果用作替换值。

var res = "Hello World!".replace(/\S+/, function (word) {
    // Since this function represents a transformation,
    // replacing literal strings (as with replaceAll) are not a viable solution.
    return "" + word.length;
})
// res => "5 6"

只。。在爪哇。并且,最好作为可以重用的“单一方法”或“模板”。


答案 1

您的答案在 Matcher#appendReplacement 文档中。只需将函数调用放在 while 循环中即可。

[appendReplacement 方法] 旨在与 appendTail 和 find 方法一起在循环中使用。例如,下面的代码将院子里的一只狗和两只狗写入标准输出流:

Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());

答案 2

当允许Java 8时,您可以使用Lambda-Expressions,以获得像替换这样的JavaScript:

String result = StringReplacer.replace("Hello World!", Pattern.compile("\\S+"), m -> ("" + m.group().length()));

StringReplacer.java:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringReplacer {
    public static String replace(String input, Pattern regex, Function<Matcher, String> callback) {
        StringBuffer resultString = new StringBuffer();
        Matcher regexMatcher = regex.matcher(input);
        while (regexMatcher.find()) {
            regexMatcher.appendReplacement(resultString, callback.apply(regexMatcher));
        }
        regexMatcher.appendTail(resultString);

        return resultString.toString();
    }
}

资料来源:http://www.whitebyte.info/programming/string-replace-with-callback-in-java-like-in-javascript