JavaScript(jQuery)正则表达式,用于搜索数组

时间:2010-04-23 14:26:06

标签: javascript regex

首先,我不知道RegEx,但我正在尝试拼凑一些东西以使其成功。只是想让你被预先警告。 ;)

无论如何,我正在尝试创建一个正则表达式来从数组中取一个单词,看看它是否与另一个数组中的单词匹配。如果关键字数组字符串包含searchTerm字,我只希望搜索返回true。 (即一个人会是假的,所以也是假的)。非常感谢任何帮助。

var searchTerm = ['one','two','three'];
var keywords = ['String which contains one', 'This string is 2', 'Three is here'];
var keywordIndex;

// loop through each keyword array
$.each(keywords, function(i) {
  var found = false;

  $.each(searchTerm, function(j) {
    var rSearchTerm = new RegExp('\b' + searchTerm[j] + '\b',i);

    // if search term is found, swap accordion div content
    if (keywords[i].search(rSearchTerm) > -1) {
      found = true;
      keywordIndex = i;  // grouping keyword is in
      return false;
    }
  }); // end searchTerm loop
  if (found) { return false; }
}); // end keyword loop

编辑:在此示例中,只有关键字[1]会失败。

4 个答案:

答案 0 :(得分:4)

这将有效:

var searchTerm = ['one','two','three'];
var keywords = ['String which contains one', 'This string is 2', 'Three is here'];
var keywordIndex;

// loop through each keyword array
$.each(keywords, function(i) {
  $.each(searchTerm, function(j) {
    var rSearchTerm = new RegExp('\\b' + searchTerm[j] + '\\b','i');
    // if search term is found, swap accordion div content
    if (keywords[i].match(rSearchTerm)) {
      keywordIndex = i;  // grouping keyword is in
      alert(keywords[i]); //debug
    }
  }); // end searchTerm loop
}); // end keyword loop

两次更正:

  • 该标志应该是字符串"i",而不是i,这是一个本地int变量。
  • 反斜杠需要转义,因为它是字符串的一部分(字面反斜杠):"\\b"'\b'作为垃圾字符串出现:``。

一些注意事项:我已将search更改为match(我从未使用过搜索,所以我想确保它有效)。次优化 - 如果更改循环的嵌套(例如,首先$.each(searchTerm),则可以在外循环中创建正则表达式。

答案 1 :(得分:1)

另一种可能更高效的方法是将关键字连接到具有唯一分隔符的字符串,然后对该单个字符串执行正则表达式。如果我在最好的情况下是正确的,它们具有大致相同的效率,并且在最坏的情况下,第一解决方案效率是O(n)^ 2,而这一个是O(n)(对于一次内循环加上O(n)使它仍然是O(n))。

var searchTerm = ['one','two','three'];
var keywords = ['String which contains one', 'This string is 2', 'Three is here'];
var joinedKey = keywords.join(';');
$.each(searchTerm, function(j) {
  var rSearchTerm = new RegExp('\\b' + searchTerm[j] + '\\b','i');
  //Find an occurrence of the search term 'j' in the joined string
  var index = joinedKey.search(rSearchTerm);
  if(index >= 0)
  {
    //Now if you want to know the item in which the key was found you can calculate length of items.
    var len = 0;
    for(var pos=0; pos < keywords.length; pos++)
    {
      len+=keywords[pos];
      if(len>index)
      {
        alert(keywords[pos]);
        return true;
      }
    }
  }

}

}); //结束searchTerm循环

答案 2 :(得分:0)

正则表达式不会搜索数组。你需要一个循环来循环遍历数组的元素。 Regexp只搜索字符串值,但可以搜索数字值,就好像它们是字符串一样。听起来你需要在循环中使用正则表达式来搜索特定单词的每个数组索引。

答案 3 :(得分:0)

嗯,你只有一个全局变量来存储索引。很难确切地说出你想要发生什么,但是如果它匹配第一个(i = 0)并且它匹配第三个(i = 2),那么“keywordIndex”将只是数字2。你想要“keywordIndex”来代替一个数组吗?如果是,那么:

var keywordIndex = [];

// ...

      if (keywords[i].search(rSearchTerm) > -1) {
         keywordIndex.push(i);  // grouping keyword is in
      }

这将为您留下一个包含找到匹配项的索引的数组。