假设我想换几个单词。比如说,我想用猫换狗,用老鼠换老鼠,这样
这是我对猫狗的看法:我喜欢狗,但我不喜欢猫。这是我对老鼠的看法:我害怕老鼠,但我不怕老鼠。
变成了
这是我对猫和狗的看法:我喜欢猫,但我不喜欢狗。这是我对老鼠的看法:我害怕老鼠,但我不害怕老鼠。
naїve方法
text = text.replace("dogs", "cats")
.replace("cats", "dogs")
.replace("mice", "rats")
.replace("rats", "mice")是有问题的,因为它可以多次对相同的单词执行替换。上面的任何一个例句都会变成
这是我对狗和狗的看法:我喜欢狗,但我不喜欢狗。这是我对老鼠的看法:我害怕老鼠,但我不害怕老鼠。
什么是最简单的算法来替换字符串对,同时防止某些东西被多次替换?
发布于 2015-08-19 03:21:50
使用任何您认为合适的字符串搜索算法,只要它能够搜索正则表达式。搜索一个匹配所有想要交换的单词的正则表达式,例如dogs|cats|mice|rats。为结果维护一个单独的字符串(在许多语言中,这需要某种类型的StringBuilder以使重复追加更快),最初是空的。对于每个匹配,需要在前一个匹配结束(或字符串的开头)和当前匹配之间追加字符,然后将适当的替换(大概是从散列映射中获得)附加到结果中。
大多数标准库应该允许您使用内置方法轻松地完成这一任务。有关Java示例,请参阅Matcher.appendReplacement(StringBuffer, String)文档。我还记得在C#中也是这样做的,它使用一个特性,您可以指定一个lambda函数来决定用什么替换每个匹配。
发布于 2015-08-19 03:42:54
诚然,我对regex不太熟悉,所以我的想法是创建一个数组,然后循环遍历元素,看看是否应该替换它。首先,将这个句子分成一组单词:
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循环来替换单词:
for(int i = 0; i < sentence.length; i++) {
if(sentence[i].equals("cats") {
sentence[i] = "dogs";
}
//more similar if statements
}现在sentence[]包含了带有单词的新句子。一些正则魔法应该让你也保留标点符号。我希望这有帮助,如果有什么可以改进的话,请告诉我。
https://stackoverflow.com/questions/32085742
复制相似问题