Помогите составить регулярку!
Здравствуйте.
Делаем таблицу, 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: |
Появилась идея составлять регулярное выражение так:
"(.*1.*)(.*2.*)|(.*2.*)(.*1.*)" Где 1 и 2 это слова введённые в поиск, но проблема в том, что при большом количестве слов в поиске регулярка получится огромной, да и алгоритм составления не прост) Идея в том чтобы перебрать все варианты расположения слов. |
Сделал 2 регулярки и ищу вторую в результатах первой. Получается много циклов, но другого решения не вижу.
|
Если вам позволяет задача, попробуйте искать текст с помощью 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", "Петров", "Артём")); |
Antonius,
Спасибо, у нас будет 2 режима поиска (Строгий и обычный. В строгом будет indexOf) |
Цитата:
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. |