Regex.test V.S. string.match знать, соответствует ли строка регулярному выражению

Много раз я использую строку match, чтобы узнать, соответствует ли строка регулярному выражению.

if(str.match(/{regex}/))

Есть ли разница между этим:

if (/{regex}/.test(str))

Они, похоже, дают тот же результат?

Ответ 1

Основное использование

Во-первых, посмотрим, что делает каждая функция:

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 vs match | Performance Test

Заключение

Используйте .test, если вам нужна более быстрая логическая проверка. Используйте .match для получения всех совпадений при использовании глобального флага g.

Ответ 2

Не забудьте принять во внимание глобальный флаг в вашем регулярном выражении:

var reg = /abc/g;
!!'abcdefghi'.match(reg); // => true
!!'abcdefghi'.match(reg); // => true
reg.test('abcdefghi');    // => true
reg.test('abcdefghi');    // => false <=

Это потому, что Regexp отслеживает lastIndex, когда найдено новое совпадение.