Единственный надежный способ сделать это - поиск ЛИБО полной, цитируемой последовательности ИЛИ поискового термина.Вы делаете это с одним регулярным выражением, и после каждого матча вы определяете, какой из них вы подходите.Если это поисковый термин, вы заменяете его;в противном случае вы оставите это в покое.
Это означает, что вы не можете использовать replaceAll()
.Вместо этого вы должны использовать методы appendReplacement()
и appendTail()
, как это делает сам 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());
output:
Replace this example. Don't replace "this example." Replace this example.
Replace this REPLACE. Don't replace "this example." Replace this REPLACE.
См. Демонстрацию онлайн
Я предполагаю, что каждыйкавычки значительны, и их нельзя избежать - другими словами, что вы работаете с прозой, а не с исходным кодом.С обработанными кавычками можно справиться, но это сильно усложняет регулярное выражение.
Если вам действительно нужно использовать replaceAll()
, то - это трюк, в котором вы используете упреждающий взгляд, чтобы утверждать, что совпадениес последующим четным количеством цитат.Но это действительно некрасиво, и для больших текстов вы можете найти это слишком дорого, с точки зрения производительности.