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