Помогите составить регулярку!
Здравствуйте.
Делаем таблицу, 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, время: 08:30. |