JavaScript (jQuery) Регулярное выражение для поиска в массиве - PullRequest
2 голосов
/ 23 апреля 2010

Прежде всего, я не знаю RegEx, но пытаюсь собрать что-то вместе, чтобы сделать эту работу.Просто хотел, чтобы тебя предупредили.;)

В любом случае, я пытаюсь создать регулярное выражение, чтобы взять слово из массива и посмотреть, соответствует ли оно слову в другом массиве.Я только хочу, чтобы поиск возвращал истину, если строка массива ключевого слова содержит слово searchTerm.(то есть один будет ложным, так же как и один).Любая помощь приветствуется.

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 ]

4 голосов
/ 23 апреля 2010

Это будет работать:

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 голос
/ 17 мая 2013

Другой подход, который также может быть более эффективным, - это объединить ключевые слова в строку с уникальными разделителями и затем выполнить регулярное выражение для этой единственной строки.Если я прав в лучшем случае, они имеют примерно одинаковую эффективность, а в худшем случае первая эффективность решения равна 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

0 голосов
/ 23 апреля 2010

Ну, у вас есть только одна глобальная переменная для хранения индексов. Трудно точно сказать, что именно вы хотите, но если он соответствует первому (i = 0) и соответствует третьему (i = 2), то «keywordIndex» будет просто номером 2. Вы хотите, чтобы "keywordIndex" вместо этого был массивом? Если так, то:

var keywordIndex = [];

// ...

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

Это оставит вас с массивом, содержащим индексы, для которых найдено совпадение.

0 голосов
/ 23 апреля 2010

Регулярное выражение не будет искать массив.Вам нужен цикл для циклического перемещения по элементам массива.Regexp ищет только строковые значения, но может искать числовые значения, как если бы они были строками.Похоже, вам нужно будет использовать регулярное выражение в цикле для поиска в каждом индексе массива определенного слова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...