29

次の 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で。そして、できれば再利用できる「単一のメソッド」または「テンプレート」として。

4

4 に答える 4

16

Java 8 を許可する場合、ラムダ式を使用して、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

于 2014-12-08T13:51:20.633 に答える
-1

正確な要件が何であるかはわかりませんが、次のようなものが機能する可能性があります。

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

もちろん、それを記述する他の方法と、要件に応じて調整できる調整があります (たとえば、スペースよりも正確な区切り記号を使用します)。

スニペットを正確に実装するには、たとえばStreamTokenizeraStringReaderといくつかのラッパーを使用して区切り文字を解析し、カウントの間に挿入できます。

于 2013-11-02T01:09:48.087 に答える