Регулярное выражение: Соответствие частичной или полной строке

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

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

for (var i=0; i < liveFilterData.length; i+=1) {

    if (liveFilterData[i].match(liveFilter.val())) {
        alert();
    }
}

Мне нужно, чтобы liveFilter.val() и регулярное выражение соответствовали текущему элементу массива liveFilterData[i], поэтому, если кто-то вводит H или h в текстовое поле, он проверяет, есть ли соответствующий элемент в массиве. Если они вводят He или he, то это соответствует Head, Header или heading.

Извините, я просмотрел весь Интернет о том, как создавать регулярные выражения, но я не могу это понять.


person Chris Spittles    schedule 08.03.2011    source источник


Ответы (2)


Простое сравнение строк поможет:

for (var v, i = liveFilterData.length; i--;) { 
    if (liveFilterData[i].slice (0, (v = liveFilter.val().toLowerCase ()).length) === v) {
        alert();
    }
}

liveFilterData должен содержать слова в нижнем регистре.

person HBP    schedule 08.03.2011

Я не уверен, что полностью понимаю вопрос. Является ли liveFilter.val() регулярным выражением или это просто строка, которую вы пытаетесь сопоставить с любым значением в массиве? Я предполагаю, что у вас есть событие при нажатии клавиши текстового поля, нажатии клавиши или нажатии клавиши, и что код, который вы написали выше, выполняется в обратном вызове для этого события. Если это так, есть ряд вещей, которые вы можете сделать, чтобы преобразовать значение в соответствующее регулярное выражение: "^"+liveFilter.val(), поскольку вы используете регулярное выражение в цикле, вы должны предварительно скомпилировать его с помощью new RegExp, чтобы ваш цикл выглядел примерно так:

//the i in the second param here is a flag indicating case insensitive
//a hat '^' in regex means 'beginning of the input'
regex = new RegExp("^"+liveFilter.val(), i);
for (var i=0; i < liveFilterData.length; i+=1) {
    // regex.test uses the precompiled regex, and determines if there is a match 
    if (regex.test(liveFilterData[i])) {
        alert("matched " + i);
    }
}

Надеюсь это поможет!

person idbentley    schedule 08.03.2011