私は実際にはCode-Guruの答えの方が好きですが、それは単なる好奇心だとおっしゃっていたので、ここに再帰的な解決策があります。アイデアは、置き換えようとしている文字列の一部だけを分離し、残りの部分を繰り返して、すでに行ったものを誤って置き換えないようにすることです。ここで、2つのルールに共通のプレフィックスがある場合、目的の結果を得るには、ルールの順序付けを行う必要がある場合がありますが、次のようになります。
public class ParallelReplace
{
public String replace(String s, Rule... rules)
{
return runRule(s, 0, rules);
}
private String runRule(String s, int curRule, Rule... rules)
{
if (curRule == rules.length)
{
return s;
}
else
{
Rule r = rules[curRule];
int index = s.indexOf(r.lhs);
if (index != -1)
{
return runRule(s.substring(0, index), curRule + 1, rules) + r.rhs
+ runRule(s.substring(index + r.rhs.length()), curRule + 1, rules);
}
else
{
return runRule(s, curRule + 1, rules);
}
}
}
public static class Rule
{
public String lhs;
public String rhs;
public Rule(String lhs, String rhs)
{
this.lhs = lhs;
this.rhs = rhs;
}
}
public static void main(String[] args)
{
String s = "foo1bar2";
ParallelReplace pr = new ParallelReplace();
System.out.println(pr.replace(s, new Rule("foo", "bar"), new Rule("bar", "foo")));
}
}