Много раз я использую строковую match
функцию, чтобы узнать, соответствует ли строка регулярному выражению.
if(str.match(/{regex}/))
Есть ли разница между этим:
if (/{regex}/.test(str))
Кажется, они дают одинаковый результат?
Много раз я использую строковую match
функцию, чтобы узнать, соответствует ли строка регулярному выражению.
if(str.match(/{regex}/))
Есть ли разница между этим:
if (/{regex}/.test(str))
Кажется, они дают одинаковый результат?
Ответы:
Во-первых, давайте посмотрим, что делает каждая функция:
regexObject . тест ( строка )
Выполняет поиск соответствия между регулярным выражением и указанной строкой. Возвращает истину или ложь .
строка . матч ( RegExp )
Используется для получения совпадений при сопоставлении строки с регулярным выражением. Возвращает массив с совпадениями или,
null
если их нет.
Так как null
оценивает false
,
if ( string.match(regex) ) {
// There was a match.
} else {
// No match.
}
Есть ли разница в производительности?
Да . Я нашел эту короткую заметку на сайте MDN :
Если вам нужно узнать, соответствует ли строка регулярному выражению regexp, используйте regexp.test (string).
Разница значительна?
Ответ еще раз - ДА ! Этот jsPerf, который я собрал, показывает разницу ~ 30% - ~ 60% в зависимости от браузера:
Используйте, .test
если вам нужна более быстрая логическая проверка. Используется .match
для получения всех совпадений при использовании g
глобального флага.
.test()
. :)
Не забудьте учесть глобальный флаг в вашем регулярном выражении:
var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi'); // => true
reg.test('abcdefghi'); // => false <=
Это потому, что Regexp отслеживает lastIndex при обнаружении нового совпадения.
.test()
? Не стоит ли .test()
проверять, имеет ли строка соответствующее регулярное выражение?
Это мои результаты теста
тест 4267740 операций в секунду ± 1,32% (60 проб выборки)
Exec 3649719 операций в секунду ± 2,51% (60 проб выборки)
соответствует 3623125 операций в секунду ± 1,85% (62 запускаемых выборки)
indexOf 6230325 операций в секунду ± 0,95% (62 прогона выборки)
метод test быстрее метода match, но самый быстрый метод - indexOf