使用String replaceAll在某些字符前面时如何不替换

Posted

技术标签:

【中文标题】使用String replaceAll在某些字符前面时如何不替换【英文标题】:How to not replace when preceded with some characters using String's replaceAll 【发布时间】:2012-04-05 21:26:01 【问题描述】:

我需要替换文本中的一些单词,但是我需要在替换策略中放入条件如下:

我想用 word2 替换 word1

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

但如果 word1 前面有 word3 ,我不想替换它:

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

如果文本是 word3.word1 我不想碰它。 但我似乎无法使用 StringreplaceAll 方法处理 单词边界

编辑:

如果 word1 的前缀或后缀为“-”字符,即 -word1word1-,我也不想更改-word1-

任何帮助都将不胜感激。

【问题讨论】:

如果你想替换 word1 并且它是分离的,你可以使用String.replaceAll(" word1 ", " word2 ")(注意前导和结束空格)。您的字符串word3.word1 不会受到影响。干杯! 【参考方案1】:

使用正则表达式进行否定回溯:(?<!word3\\.)word1

【讨论】:

+1 这很好用。如果 word1 具有“-”字符的后缀或前缀,即“-word1”或“word1-”或“-word1-”,我不想替换怎么办【参考方案2】:

我想这会给你一个提示

String str = "word3.word1.word2.word1";
str.replaceAll("word3.word1", "word3.wordX1").replaceAll("word1", "word2").replaceAll("wordX1", "word1");

【讨论】:

当然!我提到 'wordX1' 作为一些字符串,可以假定它在字符串列表中永远不可用。如果可以假设,那么你不能使用这个。【参考方案3】:

我假设以下情况

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

我相信它可以帮助你......!

【讨论】:

您对 replaceAll 的调用基本上是无操作的,因为字符串是不可变的。 文本中可能有多个 word1、word2 和 word3,遗憾的是这无济于事。【参考方案4】:

如果 word1 前面有 word3,我不想替换它。

您需要使用negative lookbehind。

除非你想硬编码你可能想使用的单词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.

【讨论】:

+1 这很好用。如果 word1 具有“-”字符的后缀或前缀,即“-word1”或“word1-”或“-word1-”,我不想替换怎么办 看看消极的lookbehind和消极的lookahead。

以上是关于使用String replaceAll在某些字符前面时如何不替换的主要内容,如果未能解决你的问题,请参考以下文章

用另一个替换特定字符串 - String#replaceAll()

String系列之replaceAll方法替换.

Java-String的replaceAll()方法(力扣20题相关)

String 类中replace 和replaceAll方法的区别

JAVA中string.replace和string.replaceAll的区别及用法

JAVA中string.replace和string.replaceAll的区别及用法