How to not replace when preceded with some charact

2019-02-20 05:37发布

I need to replace some words in a text, but I need to put conditions in the replacement strategy as follows:

I want to replace word1 with word2:

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

but I don't want to replace word1 if it's preceded by word3 which is:

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

That is if the text is word3.word1 I don't want to touch it. But I can't seem to handle that with word boundaries using String's replaceAll method.

EDIT:

And also I don't want to change if word1 has a prefix or suffix of "-" character i.e. -word1 or word1- or -word1-

Any help would be appreciable.

4条回答
甜甜的少女心
2楼-- · 2019-02-20 05:55

i m assuming the following scenario

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

programatically you do like this

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

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

i believe it may help you ...!

查看更多
萌系小妹纸
3楼-- · 2019-02-20 05:56

I think this will give you a hint

String str = "word3.word1.word2.word1";
str.replaceAll("word3.word1", "word3.wordX1").replaceAll("word1", "word2").replaceAll("wordX1", "word1");
查看更多
\"骚年 ilove
4楼-- · 2019-02-20 05:58

Use regular expressions with negative lookbehind: (?<!word3\\.)word1

查看更多
我想做一个坏孩纸
5楼-- · 2019-02-20 06:07

I don't want to replace word1 if it's preceded by word3.

You need to use a negative lookbehind.

Unless you want to hard-code the words you probably want to use Pattern.quote as well.

Here's some example code:

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);

Output:

aaa word2 bbb word3.word1 ccc

(first word1 is replaced, second word1 is not replaced since it is preceeded by word3.)

查看更多
登录 后发表回答