Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите составить регулярку! (https://javascript.ru/forum/misc/44383-pomogite-sostavit-regulyarku.html)

tsigel 17.01.2014 16:06

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

Делаем таблицу, 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);
}


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

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

tsigel 17.01.2014 16:46

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

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

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

Идея в том чтобы перебрать все варианты расположения слов.

tsigel 17.01.2014 17:40

Сделал 2 регулярки и ищу вторую в результатах первой. Получается много циклов, но другого решения не вижу.

Antonius 18.01.2014 04:56

Если вам позволяет задача, попробуйте искать текст с помощью 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", "Петров", "Артём"));

tsigel 20.01.2014 12:24

Antonius,
Спасибо, у нас будет 2 режима поиска (Строгий и обычный. В строгом будет indexOf)

ksa 21.01.2014 15:42

Цитата:

Сообщение от 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);


Часовой пояс GMT +3, время: 07:17.