これを行う唯一の信頼できる方法は、引用符で囲まれた完全なシーケンスまたは検索語のいずれかを検索することです。これを 1 つの正規表現で行い、一致するたびに、どの正規表現に一致したかを判断します。それが検索語である場合は、それを置き換えます。それ以外の場合は、そのままにしておきます。
使えないということですねreplaceAll()
。代わりに、それ自体と同じようにappendReplacement()
andappendTail()
メソッドを使用する必要があります。replaceAll()
次に例を示します。
String s = "Replace this example. Don't replace \"this example.\" Replace this example.";
System.out.println(s);
Pattern p = Pattern.compile("\"[^\"]*\"|(\\bexample\\b)");
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();
while (m.find())
{
if (m.start(1) != -1)
{
m.appendReplacement(sb, "REPLACE");
}
}
m.appendTail(sb);
System.out.println(sb.toString());
出力:
Replace this example. Don't replace "this example." Replace this example.
Replace this REPLACE. Don't replace "this example." Replace this REPLACE.
オンラインでデモを見る
私は、すべての引用符が重要であり、エスケープできないと想定しています。つまり、ソース コードではなく、散文を扱っているということです。エスケープされた引用符は処理できますが、正規表現が非常に複雑になります。
本当に を使用する必要replaceAll()
がある場合は、先読みを使用して、一致の後に偶数個の引用符が続くことをアサートするトリックがあります。しかし、それは本当に醜く、大きなテキストの場合、パフォーマンスの点で法外にコストがかかることに気付くかもしれません。