首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用B替换所有的A,用A替换所有的B

用B替换所有的A,用A替换所有的B
EN

Stack Overflow用户
提问于 2015-08-19 02:47:40
回答 2查看 142关注 0票数 3

假设我想换几个单词。比如说,我想用猫换狗,用老鼠换老鼠,这样

这是我对猫狗的看法:我喜欢狗,但我不喜欢猫。这是我对老鼠的看法:我害怕老鼠,但我不怕老鼠。

变成了

这是我对猫和狗的看法:我喜欢猫,但我不喜欢狗。这是我对老鼠的看法:我害怕老鼠,但我不害怕老鼠。

naїve方法

代码语言:javascript
复制
text = text.replace("dogs", "cats")
           .replace("cats", "dogs")
           .replace("mice", "rats")
           .replace("rats", "mice")

是有问题的,因为它可以多次对相同的单词执行替换。上面的任何一个例句都会变成

这是我对狗和狗的看法:我喜欢狗,但我不喜欢狗。这是我对老鼠的看法:我害怕老鼠,但我不害怕老鼠。

什么是最简单的算法来替换字符串对,同时防止某些东西被多次替换?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-19 03:21:50

使用任何您认为合适的字符串搜索算法,只要它能够搜索正则表达式。搜索一个匹配所有想要交换的单词的正则表达式,例如dogs|cats|mice|rats。为结果维护一个单独的字符串(在许多语言中,这需要某种类型的StringBuilder以使重复追加更快),最初是空的。对于每个匹配,需要在前一个匹配结束(或字符串的开头)和当前匹配之间追加字符,然后将适当的替换(大概是从散列映射中获得)附加到结果中。

大多数标准库应该允许您使用内置方法轻松地完成这一任务。有关Java示例,请参阅Matcher.appendReplacement(StringBuffer, String)文档。我还记得在C#中也是这样做的,它使用一个特性,您可以指定一个lambda函数来决定用什么替换每个匹配。

票数 3
EN

Stack Overflow用户

发布于 2015-08-19 03:42:54

诚然,我对regex不太熟悉,所以我的想法是创建一个数组,然后循环遍历元素,看看是否应该替换它。首先,将这个句子分成一组单词:

代码语言:javascript
复制
String text = "This is my opinion about dogs and cats: I like dogs but I don't like cats.";
String[] sentence = text.split("[^a-zA-Z]"); //can't avoid regex here

然后使用包含一系列if语句的for循环来替换单词:

代码语言:javascript
复制
for(int i = 0; i < sentence.length; i++) {
    if(sentence[i].equals("cats") {
        sentence[i] = "dogs";
    }
    //more similar if statements
}

现在sentence[]包含了带有单词的新句子。一些正则魔法应该让你也保留标点符号。我希望这有帮助,如果有什么可以改进的话,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32085742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档