Много раз я использую строку match
, чтобы узнать, соответствует ли строка регулярному выражению.
if(str.match(/{regex}/))
Есть ли разница между этим:
if (/{regex}/.test(str))
Они, похоже, дают тот же результат?
Во-первых, посмотрим, что делает каждая функция:
regexObject. test (String)
Выполняет поиск соответствия между регулярным выражением и указанной строкой. Возвращает true или false.
string. match (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, когда найдено новое совпадение.