Как не заменять, если ему предшествуют некоторые символы, используя String replaceAll

Мне нужно заменить некоторые слова в тексте, но мне нужно поставить условия в стратегии замены следующим образом:

Я хочу заменить word1 на word2:

String word1 = "word1";
String word2 = "word2";

но я не хочу заменять word1, если ему предшествует word3, то есть:

String word3 = "word3."; //with the dot at the ending

То есть, если текст word3.word1, я не хочу его трогать. Но я не могу справиться с этим с границами слов, используя метод replaceAll String.

ИЗМЕНИТЬ:

А также я не хочу менять, если слово1 имеет префикс или суффикс символа "-", т.е. -word1 или word1- или -word1-

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


person GingerHead    schedule 21.03.2012    source источник
comment
Если вы хотите заменить word1 и оно отсоединено, вы можете использовать String.replaceAll(" word1 ", " word2 ") (обратите внимание на начальные и конечные пробелы). Ваша строка word3.word1 не будет затронута. Ваше здоровье!   -  person SimonSez    schedule 21.03.2012


Ответы (4)


Я думаю, это даст вам подсказку

String str = "word3.word1.word2.word1";
str.replaceAll("word3.word1", "word3.wordX1").replaceAll("word1", "word2").replaceAll("wordX1", "word1");
person namalfernandolk    schedule 21.03.2012
comment
Определенно! Я упомянул «wordX1» как некоторую строку, которую можно предположить, что она никогда не будет доступна в списке строк. Если вы можете предположить, правда, вы не можете использовать это. - person namalfernandolk; 21.03.2012

Используйте регулярные выражения с отрицательным просмотром назад: (?<!word3\\.)word1

person AlexR    schedule 21.03.2012
comment
+1 Это отлично работает. Как насчет того, если я не хочу заменять, если слово1 имеет суффикс или префикс -символа, то есть -слово1 или слово1- или -слово1- - person GingerHead; 21.03.2012

я предполагаю следующий сценарий

String word1 = "word1";
String word2 = "word2";
String word3 = "word3";
String mysentence = "word3.myname.word1";

программно вы делаете так

int word1loc = mysentence.indexOf(word1);
int word2loc = mysentence.indexOf(word2);
int word3loc = mysentence.indexOf(word3);

if (word1loc> word3loc){
mysentence.replaceAll(word1,word2);
}

я верю, что это может помочь вам ...!

person Karthikeyan Arumugam    schedule 21.03.2012
comment
Однако ваш вызов replaceAll в основном не работает, поскольку строки неизменяемы. - person aioobe; 21.03.2012
comment
В тексте может быть более одного слова1, слово2 и слово3, к сожалению, это не поможет. - person GingerHead; 21.03.2012

Я не хочу заменять слово1, если ему предшествует слово3.

Вам необходимо использовать отрицательный поиск назад.

Если вы не хотите жестко закодировать слова, вы, вероятно, также захотите использовать Pattern.quote.

Вот пример кода:

String word1 = "word1";
String word2 = "word2";
String word3 = "word3.";

String regex = String.format("(?<!%s)%s", Pattern.quote(word3),
                                          Pattern.quote(word1));

String input = "aaa word1 bbb word3.word1 ccc";

String result = input.replaceAll(regex, word2);

System.out.println(result);

Вывод:

aaa word2 bbb word3.word1 ccc

(первый word1 заменяется, второй word1 не заменяется, так как ему предшествует word3.)

person aioobe    schedule 21.03.2012
comment
+1 Это отлично работает. Как насчет того, если я не хочу заменять, если слово1 имеет суффикс или префикс -символа, то есть -слово1 или слово1- или -слово1- - person GingerHead; 21.03.2012
comment
Взгляните на отрицательный взгляд назад и отрицательный взгляд вперед. - person aioobe; 21.03.2012