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

use*_*740 20 java regex replace function matchevaluator

我正在寻找一种非常简单的方法来获得类似以下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"
Run Code Online (Sandbox Code Playgroud)

只有..在Java中.并且,优选地作为可以重复使用的"单一方法"或"模板".

jta*_*orn 19

您的答案在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());
Run Code Online (Sandbox Code Playgroud)

  • [Here](http://stackoverflow.com/a/1282099/20938)是一个更完整的解决方案.它通过`appendReplacement()`处理美元符号和反斜杠被视为特殊问题. (2认同)

Joo*_*gen 14

从 Java 9 开始Matcher.replaceAll

Pattern.compile("\\S+").matcher("Hello World!")
        .replaceAll(mr -> "" + mr.group().length());
Run Code Online (Sandbox Code Playgroud)

自由命名的参数mr是 a MatchResult,具有类似mr.group(1)or 的访问方法mr.end() - mr.start()

  • *最后*..:| (3认同)

Nic*_*ler 9

在允许Java 8时,您可以使用Lambda-Expressions来获得类似于替换的JavaScript:

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

StringReplacer.java:

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

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

        return resultString.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

StringReplacerCallback.java:

import java.util.regex.Matcher;

public interface StringReplacerCallback {
    public String replace(Matcher match);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您可能希望在替换字符串上调用`Matcher.quoteReplacement`,以避免特殊处理斜线和美元符号. (3认同)