【问题标题】:Searching for words in string搜索字符串中的单词
【发布时间】:2017-06-17 12:44:13
【问题描述】:

我正在尝试创建一个函数来查找包含数组中所有单词的字符串。

我试过这个:

function multiSearchOr(text, searchWords){
    var searchExp = new RegExp(searchWords.join("|"),"gi");
    return (searchExp.test(text))?"Found!":"Not found!";
}

alert(multiSearchOr("Hello my name sam", ["Hello", "is"]))

但这只会在找到其中一个单词时提示“找到”。

当所有单词都在字符串中时,我需要它来提醒我。

一个例子:

var sentence = "I love cake"    
var words = ["I", "cake"];

我希望应用程序在从字符串句子的数组中找到所有单词时提醒我。不是当它只找到一个单词时。

【问题讨论】:

  • @MatthewSanetra 我不需要整个世界,我需要它在字符串中找到所有来自数组的单词时提醒我。
  • 您需要遍历数组,创建正则表达式,test 它,如果没有找到 return false; 否则 return true;
  • 统计字符串中特定单词的总数 JavaScript stackoverflow.com/a/65036248/4752258

标签: javascript regex


【解决方案1】:

如果您只对使用单个正则表达式感兴趣,那么您需要在构造表达式时使用正向前瞻。它看起来像这样:

'(?=\\b' + word + '\\b)'

鉴于此构造,您可以创建正则表达式并测试匹配:

function multiSearchOr(text, searchWords){
    var regex = searchWords
        .map(word => "(?=.*\\b" + word + "\\b)")
        .join('');
    var searchExp = new RegExp(regex, "gi");
    return (searchExp.test(text))? "Found!" : "Not found!";
}

【讨论】:

【解决方案2】:

这是一个工作示例。您只需要遍历数组并使用indexOf() 比较字符串中是否存在单词。如果不相等则提示未找到,否则提示已找到。

function multiSearchOr(text, searchWords){

   for(var i=0; i<searchWords.length; i++)
   {
    if(text.indexOf(searchWords[i]) == -1)
      return('Not Found!');
   }
   return('Found!');
}

alert(multiSearchOr("Hello my name sam", ["Hello", "is"]));

【讨论】:

  • 这是区分大小写的。 OP 想要敏感地检查大小写-in
  • @Tushar 将.toLowerCase() 添加到传递给函数的变量中。
【解决方案3】:

这就是你要找的吗?这样,您可以使用包含非字母数字字符的更复杂的句子。

var sentence = "Hello, how are you ?"
var test1 = ["Hello", "how", "test"];
var test2 = ["hello", "How"];

function multiSearchOr(text, searchWords){
  if (text && searchWords) {
      var filteredText = text.match(/[^_\W]+/g);
      
      if (filteredText !== null) {
        var lowerCaseText = filteredText.map(function(word) { 
          return word.toLowerCase(); 
        });
        
        for (var i = 0; i < searchWords.length; i++) {
          if (lowerCaseText.indexOf(searchWords[i].toLowerCase()) === -1) {
            return "Not found!";
          }
        }
        
        return "Found!"
      }
    
      return "Error: the text provided doesn't contain any words!"
  }
  
  return "Error: Props are missing";
}

console.log(multiSearchOr(sentence, test1));
console.log(multiSearchOr(sentence, test2));

【讨论】:

  • indexOf 区分大小写。因此,如果字符串包含Hello,而您在searchWords 中使用hello,您的解决方案将不起作用。您可以将两个字符串都转换为小写,然后使用indexOf
  • 是的,没错,但他从来没有要求过这个。如果在句子中找到了确切的单词,他可能想返回“Found”。
  • 当他在正则表达式中使用i-case-insensitive 标志时,他做到了。
  • 好收获!我没有检查他的代码。我刚刚写了我的:)
  • 统计字符串中特定单词的总数 JavaScript stackoverflow.com/a/65036248/4752258
【解决方案4】:
    if all(word in text for word in searchWords):
        print('found all')
    if any(word in text for word in searchWords):
        print('found at least one')

all() 如果您希望列表 searchWords 中的所有单词都在文本中 any() 如果文本中有一个列表词就足够了

【讨论】:

    【解决方案5】:

    这是一个版本,可以拆分您传递的句子并检查每个单词

    const matchAllEntries = (arr, target) => target.every(v => arr.includes(v));
    const arr = ['lorem', 'ipsum', 'dolor'];
    const strs = ['lorem blue dolor sky ipsum', 'sky loremdoloripsum blue', 'lorem dolor ipsum'];
    
    strs.forEach(str => {
      // split on non alphabet and numbers (includes whitespace and puntuation)
      parts = str.split(/\W/); 
      console.log(matchAllEntries(arr, parts));
    })

    【讨论】:

      猜你喜欢
      • 2011-12-27
      • 2013-10-22
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2021-06-22
      • 2013-07-12
      相关资源
      最近更新 更多