private String transform(String input, List<Substitution> substitutions) { List<String> tokens = tokenizer.tokenize(input); outer: for (int i = 0; i < tokens.size(); ) { int offset = i; for (final Substitution substitution : substitutions) { i = substitution.substitute(offset, tokens); if (i > offset) continue outer; } // Only gets here if no substitution matches. i++; } return tokenizer.toString(tokens); }