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