置換表、正規表現マッチ replace

前持って置換文字列の表を用意しておいて、正規表現で見つけて置換する処理を無駄なく
処理できるものがあったら良いだろうと考えました。

import java.util.Iterator;
import java.util.Map;
import java.util.Optional;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
/**
 * RegexMap
 */
public final class RegexMap{
   private Map<String, String> replaceMap;
   private String regex;

   private RegexMap(String regex, Map<String, String> replaceMap){
      this.regex = regex;
      this.replaceMap = replaceMap;
   }

   public static RegexMap of(String regex, Map<String, String> replaceMap){
      return new RegexMap(regex, replaceMap);
   }

   public void setRegex(String regex) {
      this.regex = regex;
   }
   public void addRegex(String match, String replacestr) {
      replaceMap.put(match, replacestr);
   }

   public String replace(String input) {
      Matcher m = Pattern.compile(regex).matcher(input);
      AtomicInteger i = new AtomicInteger(0);
      return StreamSupport.stream(Spliterators.spliteratorUnknownSize(new Iterator<String>(){
         @Override
         public boolean hasNext(){
            return m.find();
         }
         @Override
         public String next(){
            return input.substring(i.getAndSet(m.end()), m.start())
                  + Optional.ofNullable(replaceMap.get(m.group())).orElse(m.group());
         }
      }, Spliterator.ORDERED), false).collect(Collectors.joining()) + input.substring(i.get());
   }
}

インスタンス生成して使い回すのが目的です。

// 置換表
Map<String, String> map = new HashMap<>();
map.put("aa", "あ");
map.put("bb", "い");
map.put("cc", "う");
 
// インスタンス生成
RegexMap r = RegexMap.of("[a-z]+", map);

// input の中、正規表現で見つけて置換
String res = r.replace(input);

// 置換表に規則追加
r.addRegex("dd", "え");

// 変更された置換表で処理する
String res2 = r.replace(input);

これも、yipuran-core に入れました。
https://github.com/yipuran/yipuran-core/tree/master/src/main/java/org/yipuran/regex