1 package org.unicode.cldr.unittest; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.regex.Matcher; 6 import java.util.regex.Pattern; 7 8 import com.ibm.icu.impl.Row; 9 import com.ibm.icu.impl.Row.R2; 10 import com.ibm.icu.text.Transform; 11 12 public class RegexTransform implements Transform<String, String> { 13 14 public enum Processing { 15 FIRST_MATCH, ONE_PASS, RECURSIVE 16 } 17 18 private final Processing processing; 19 private final List<Row.R2<Matcher, String>> entries = new ArrayList<Row.R2<Matcher, String>>(); 20 transform(String source)21 public String transform(String source) { 22 main: while (true) { 23 for (R2<Matcher, String> entry : entries) { 24 Matcher matcher = entry.get0(); 25 if (matcher.reset(source).find()) { 26 String replacement = entry.get1(); 27 source = matcher.replaceAll(replacement); 28 switch (processing) { 29 case RECURSIVE: 30 continue main; 31 case FIRST_MATCH: 32 break main; 33 case ONE_PASS: // fall through and continue; 34 } 35 } 36 } 37 break; 38 } 39 return source; 40 } 41 RegexTransform(Processing processing)42 public RegexTransform(Processing processing) { 43 this.processing = processing; 44 } 45 add(String pattern, String replacement)46 public RegexTransform add(String pattern, String replacement) { 47 entries.add(Row.of( 48 Pattern.compile(pattern, Pattern.COMMENTS).matcher(""), 49 replacement)); 50 return this; 51 } 52 }