0xdeadbeef

Java 最高!!!

2014年04月

コールバックによる文字列置換をする方法が Java の標準ライブラリには無いようだ。
無いと困るので、適当にでっちあげた。

import java.util.regex.Matcher;

import java.util.regex.Pattern;


@FunctionalInterface

interface RegexpReplaceUtilCallback {

public String call(Matcher matcher);

}


/**

 * import static RegexpReplaceUtil.*;

 * 

 * String replacement with lambda.

 * 

 */

class RegexpReplaceUtil {

    /**

     * replaceOnce("hoge${var}", Pattern.compile("\\$\\{.*?\\}"), (m) -> {

     * return vars.get(m.group(1));

     * });

     * 

     * @param str

     * @param pattern

     * @param callback

     * @return

     */

    public static String replaceOnce(String str, Pattern pattern, RegexpReplaceUtilCallback callback){

        Matcher m = pattern.matcher(str);

        StringBuffer sb = new StringBuffer(str.length());

        if(m.find()){

            m.appendReplacement(sb, callback.call(m));

        }

        m.appendTail(sb);

        return sb.toString();

    }

    

    /**

     * replaceAll("hoge${var}", Pattern.compile("\\$\\{.*?\\}"), (m) -> {

     * return vars.get(m.group(1));

     * });

     * 

     * @param str

     * @param pattern

     * @param callback

     * @return

     */

    public static String replaceAll(String str, Pattern pattern, RegexpReplaceUtilCallback callback){

        Matcher m = pattern.matcher(str);

        StringBuffer sb = new StringBuffer(str.length());

        while(m.find()){

            m.appendReplacement(sb, callback.call(m));

        }

        m.appendTail(sb);

        return sb.toString();

    }

}
appendReplacemnt と appendTail を直接使ってもいいと思う。 

http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html#group%28java.lang.String%29

Java 7 以後でサポートされている。 

Play Framework for Java は Scala 知らなくても一応使えるんだけど、結局 Scalate 使うんなら Scala 知らないと駄目だし、sbt 使うんでも scala 知らないとダメだよね。 

依存性の管理と、Authoring Tool を分けて考えた方がいい。
一緒にやろうとするからやたらと複雑になる。 

このページのトップヘ