package ch.unibe.scg.cc.regex; import java.io.Serializable; import java.util.regex.Matcher; import java.util.regex.Pattern; /** Replace is a command (as in command pattern) to replace a regex in a string for a substitution string. */ public final class Replace implements Serializable { final private static long serialVersionUID = 1L; private final Pattern pattern; final ReplacementString replacementString; /** New Replace that replaces all matches of {@code pattern} with replacement {@code with}. */ public Replace(Pattern pattern, String with) { this.pattern = pattern; replacementString = new ReplacementString(with); } /** Replace all occurrences in {@code sb}, in place. */ public void replaceAll(StringBuilder sb) { int offset = 0; Matcher matcher = pattern.matcher(sb.toString()); while (matcher.find()) { String replacement = replacementString.fillIn(matcher); int start = matcher.start(); int end = matcher.end(); sb.replace(start + offset, end + offset, replacement); int matchLength = matcher.end() - matcher.start(); offset += replacement.length() - matchLength; } } /** @return cs with all replacings applied. */ // TODO: Too trivial to export. Should not be public. public String allReplaced(CharSequence cs) { StringBuilder sb = new StringBuilder(cs); replaceAll(sb); return sb.toString(); } }