检查字符串中是否包含单词列表

时间:2019-03-15 15:40:37

标签: javascript performance

让我们考虑以下字符串text:“我刚刚在汉堡土地上尝试了新汉堡!”以及以下字符串数组[“ eat”,“ burger”,“ fries”]

我想要知道的是text的单词是否存在于数组中,但是以一种优化的方式...不仅有两个for循环...

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以通过加入数组以创建字符串来通过正则表达式来完成此操作。

RegEx参考

通过JavaScript创建RegEx字符串后,它看起来像这样(删除了字符串转义符):

rand(2,4) > 0.4

\b(?:eat|burger|fries)\b

如果需要转义正则表达式,可以通过escaping special characters进行。并映射到需要测试的单词数组上。

const str = 'I just tried the new burgers in burger land!'
const arr = ['eat', 'burger', 'fries']

// "\b" This is a word boundary - Allows you to perform a "whole words only" search
// "(?:xxx)" This is a non-capturing group. It's not stored in memory to be referenced later on.
// 'arr.join()' creates the following string: "eat|burger|fries"
console.log(str.match(new RegExp(`\\b(?:${arr.join('|')})\\b`, 'ig')))

答案 1 :(得分:1)

最优化的IMO方式是将wordsTest作为对象而不是数组,因此查找变为O(1)操作。然后您可以使用filter获取任何匹配值。

const test = "I just tried the new burgers in burger land!";
const wordsTest = {"eat":1, "burger":1, "fries":1}

const wordsInString = (test) => test.split(' ').filter(e => wordsTest[e] )

console.log(wordsInString(test))
console.log(wordsInString('No matching words'))

答案 2 :(得分:0)

使用Array#FilterindexOf()

  1. Array#Filter过滤基于数组index的字符串匹配
  2. toLowerCase()用于区分大小写的字符串

var a ="I just tried the new burgers in burger land!";
var arr = ["eat", "burger", "fries"];

var res = arr.filter(i=> a.toLowerCase().indexOf(i.toLowerCase()) > -1)
console.log(res)