首页 > 解决方案 > 如何从文本数组中替换句子中的多个单词?

问题描述

我有一个句子和一组文本。

sentence = 'Hi I am fine. how are you'
arrayOfTexts = ['Hi','I am','how','how are','how are you']
replacedText = '** * ** fine. *** *** ***'

所以我想在这里做的,我想比较与文本值数组匹配的句子单词,并用星号'*'替换它们。

条件:

  1. 当多个词匹配而不是单个匹配时,替换词的第一偏好更高。Exp:how are youhow are younothow或替换how are。您可以认为首先替换的是更高的克数。
  2. 目前,我只想要最多 4 克(4 双)。

我的解决方案 我将我的句子转换为 4 克,并逐个搜索每一对,但我认为它有点多余。

sentenceArray = ['Hi I am fine', 'I am fine .', 'am fine . how', 'fine . how are', '. how are you','Hi I am', 'I am fine', 'am fine .', 'fine . how', '. how are', 'how are you','Hi I', 'I am', 'am fine', 'fine .', '. how', 'how are', 'are you','Hi', 'I', 'am', 'fine', '.', 'how', 'are', 'you']

我的问题 有没有更好的方法来解决这个问题?

标签: javascript

解决方案


您可以按字符串长度排序arrayOfTexts(将最长的放在第一位),然后将其转换为在每个可能的字符串之间交替的正则表达式,并执行全局替换:

const sentence = 'Hi I am fine. how are you';
const arrayOfTexts = ['Hi','I am','how','how are','how are you']
  .sort((a, b) => b.length - a.length);
const pattern = new RegExp(arrayOfTexts.join('|'), 'g');

console.log(sentence.replace(pattern, 'FOO'));

对于更动态的替换,您可以将回调传递给.replace,或者$&在替换字符串中使用匹配的子字符串替换。

如果arrayOfTexts可能在正则表达式中包含具有特殊含义的字符,则在传递给 之前将它们传递给转义函数new RegExp


推荐阅读