这就是我得到的:
string = 'John bought bought black paint for his black car'
words = string.split(' ')
duplicatelessWords = []
for (const word of words) {
if (duplicatelessWords[duplicatelessWords.length - 1] !== word) {
duplicatelessWords.push(word)
}
}
duplicatelessString = duplicatelessWords.join(' ')
应返回“约翰为他的黑色汽车购买了黑色油漆”
有没有办法使其更快?我想我需要连续多次使用它,有时是短字符串,有时是大字符串。
答案 0 :(得分:5)
您可以使用正则表达式:
const string = 'John bought bought black paint for his black black car';
const replaced = string.replace(/(\b\w+)(?: \1\b)+/g, '$1');
console.log(replaced);
我不知道这是否是最快的选择,但是它会进行一次传递,并且仅在实际需要时才进行替换-因此,当没有重复的单词时,您不会拆分字符串。
(\b\w+)
-匹配由字母数字字符组成的“单词”。您也可以将\S
用于非空格。另请参见Unicode support。第一个单词将被捕获为组编号1。(?: \1\b)+
-找到我们捕获的相同单词(\1
),重复多次(+
)。(?: )
是一个未被捕获的逻辑组。\b
是一个单词边界,可确保我们不允许单词内部部分匹配。'$1'
-找到"bought bought"
之类的重复单词后,我们将其替换为第一个单词:"bought"
。 请注意,当您在字符串中使用标点符号时,这种方法的效果很差。