Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.01.2014, 16:06
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Помогите составить регулярку!
Здравствуйте.

Делаем таблицу, c поиском.

Чтобы облегчить поиск я делаю одномерный массив строк таблицы. Например:

["|Павлов|Артём|Николайвна|65", "|Филиппов|Артём|Константинвна|8", "|Троицкий|Николай|Артёмвна|12", "|Покровский|Вадим|Артёмвич|72"]


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

Пока что мы сделали так:

function createRegExps(text, flags) {

    if (text.lastIndexOf(" ") == 0)
          text = text.slice(0, -1);

     var texts = text.split(/\s+/),
           regExps = "";

     for (var i = 0; i < texts.length; i++) {
          regExps += "(.*" + texts[i] + ".*)"
     }

    return new RegExp(regExps, flags);
}


Но такое регулярное выражение ищет только если второе слово встречается после первого.

На отчества внимания не обращайте, они генерируются из имен и халтурно (тестовые данные).

Последний раз редактировалось tsigel, 17.01.2014 в 16:10.
Ответить с цитированием
  #2 (permalink)  
Старый 17.01.2014, 16:46
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Появилась идея составлять регулярное выражение так:

"(.*1.*)(.*2.*)|(.*2.*)(.*1.*)"

Где 1 и 2 это слова введённые в поиск, но проблема в том, что при большом количестве слов в поиске регулярка получится огромной, да и алгоритм составления не прост)

Идея в том чтобы перебрать все варианты расположения слов.
Ответить с цитированием
  #3 (permalink)  
Старый 17.01.2014, 17:40
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сделал 2 регулярки и ищу вторую в результатах первой. Получается много циклов, но другого решения не вижу.
Ответить с цитированием
  #4 (permalink)  
Старый 18.01.2014, 04:56
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

Если вам позволяет задача, попробуйте искать текст с помощью indexOf — когда я экспериментировал это в некоторых случаях оказывалось значительно быстрее, чем регулярное выражение. Но этот вариант подойдет вам только если можно искать с учетом регистра и не нужно использовать специфичные для регулярного выражения возможности, такие как привязка к границам слов и т. д.

Ну и вот, например, вариант, относительно легко расширяемый до любого количества искомых слов (здесь при желании можно и регулярку для каждого слова отдельно использовать):

function strsearch(string /* word1, word2... */) {
    for (var i = 1; i < arguments.length; i++) {
        if (string.indexOf(arguments[i]) == -1) {
            return false;
        }
    }
    return true;
}

console.log(strsearch("|Филиппов|Артём|Константинвна|8", "Филиппов", "Константинвна"));
console.log(strsearch("|Филиппов|Артём|Константинвна|8", "Петров", "Артём"));
Ответить с цитированием
  #5 (permalink)  
Старый 20.01.2014, 12:24
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Antonius,
Спасибо, у нас будет 2 режима поиска (Строгий и обычный. В строгом будет indexOf)
Ответить с цитированием
  #6 (permalink)  
Старый 21.01.2014, 15:42
Аватар для ksa
ksa ksa на форуме
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,217

Сообщение от tsigel
необходимо написать регулярное выражение составленное из слов введённых в поиск так, чтобы он нашёл строку в которой есть оба слова, вне зависимости от их порядка
Как вариант...

var val='|Павлов|Артём|Николайвна|65';
var w1='Павлов';
var w2='Артём';
var re= new RegExp(w1+'\[\\s\\S\]'+w2+'\|'+w2+'\[\\s\\S\]'+w1)
alert(val.search(re) != -1);
var re= new RegExp(w2+'\[\\s\\S\]'+w1+'\|'+w1+'\[\\s\\S\]'+w2)
alert(val.search(re) != -1);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить скрипт для списка Новенькая Общие вопросы Javascript 9 10.09.2012 06:58
помогите составить запрос в БД posta Серверные языки и технологии 3 29.06.2012 09:33
Помогите сделать регулярку для HTML шаблона zeraid Общие вопросы Javascript 1 25.12.2011 15:28
Помогите "допилить" регулярку. nule Общие вопросы Javascript 6 16.11.2011 20:05
помогите составить регексп ChikiSt Общие вопросы Javascript 7 21.08.2011 09:55