Заменить слово, которого нет в строке - PullRequest
3 голосов
/ 26 октября 2011

Я пытаюсь заменить слово в файле всякий раз, когда оно появляется, кроме случаев, когда оно содержится в строке:

Так что я должен заменить this в

The test in this line consists in ... 

Но не должно совпадать в:

The test "in this line" consist in ... 

Вот что я пытаюсь:

 line.replaceAll( "\\s+this\\s+", " that ")

Но с этим сценарием не получается, поэтому я попытался использовать:

 line.replaceAll( "[^\"]\\s+this\\s+", " that ")

Но тоже не работает.

Любая помощь будет оценена

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Это похоже на работу (насколько я понимаю ваши требования из приведенных примеров):

 (?!.*\s+this\s+.*\")\s+this\s+

http://rubular.com/r/jZvR4XEbRf

Возможно, вам придется настроить выход для Java.

Это немного лучше на самом деле:

 (?!\".*\s+this\s+)(?!\s+this\s+.*\")\s+this\s+
2 голосов
/ 26 октября 2011

Единственный надежный способ сделать это - поиск ЛИБО полной, цитируемой последовательности ИЛИ поискового термина.Вы делаете это с одним регулярным выражением, и после каждого матча вы определяете, какой из них вы подходите.Если это поисковый термин, вы заменяете его;в противном случае вы оставите это в покое.

Это означает, что вы не можете использовать 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(), то - это трюк, в котором вы используете упреждающий взгляд, чтобы утверждать, что совпадениес последующим четным количеством цитат.Но это действительно некрасиво, и для больших текстов вы можете найти это слишком дорого, с точки зрения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...