Заменить строку для точного соответствия с условиями - PullRequest
1 голос
/ 15 марта 2019

Пример строки

astabD (tabD) tabD .tabD tabD.(tabD tabD)

Мне нужно заменить tabD на что-то вроде temp.tabD для каждого вхождения в приведенной выше строке, кроме первого и второго.

Для этого я попыталсяЗамените все на границу слова

str.replaceAll ("\ b" + "tabD" + "\ b", "temp.tabD"))

Работает, кромевторое вхождение.Буду признателен за любую помощь, поскольку '(' и ')' также являются ключевыми словами, и следует игнорировать только их появление.

1 Ответ

2 голосов
/ 15 марта 2019

Вы можете использовать

.replaceAll("\\b(?<!\\((?=\\w+\\)))tabD\\b", "")

Или, если tabD поступает из пользовательского ввода:

String s = "astabD (tabD) tabD .tabD tabD. (tabD tabD)";
String word = "tabD";
String wordRx = Pattern.quote(word);
s = s.replaceAll("(?<!\\w)(?<!\\((?=" + wordRx + "\\)))" + wordRx + "(?!\\w)", "");

См. Демонстрационную версию regex .

Подробности

  • \b - граница слова ((?<!\w) - однозначная левая граница слова)
  • (?<!\((?=\w+\))) - отрицательный взгляд сзадиэто не соответствует, если непосредственно перед текущим местоположением есть (, за которым следуют 1+ слова (требуется \w+, чтобы соответствовать tabD слову) с последующим ) ( ПРИМЕЧАНИЕ : Если ваша IDE сообщает вам, что + находится внутри взгляда, это ошибка IDE, так как здесь + находится в поле зрения, и квантификаторы + / * разрешены в запросах)
  • tabD - слово для поиска
  • \b - граница слова ((?!\w) - однозначная правая граница слова)

Демонстрация Java :

String s = "astabD (tabD) tabD .tabD tabD. (tabD tabD)";
System.out.println(s.replaceAll("\\b(?<!\\((?=\\w+\\)))tabD\\b", ""));
// => astabD (tabD)  . . ( )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...