Java 7中Regex-replace-with-function-evaluation的等价物是什么?

我正在寻找一种非常简单的方法来获得类似下面的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" 

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

您的答案在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()); 

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

 String result = StringReplacer.replace("Hello World!", Pattern.compile("\\S+"), (Matcher m) -> { return "" + 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, 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(); } } 

StringReplacerCallback.java:

 import java.util.regex.Matcher; public interface StringReplacerCallback { public String replace(Matcher match); } 

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

不确定您的确切要求是什么,但这样的事情可能有效:

 String res = ""; for (String piece : "hello world".split(" ")) res += Integer.toString(piece.length()) + " "; 

当然还有其他方法可以编写它,并根据需要进行调整(例如,使用比空格更准确的分隔符)。

为了精确实现您的代码段,您可以使用带有StringReader和一些包装器来解析分隔符并将它们插入到计数之间。