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

209

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

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

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

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

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

  • 3
    это лучшие тесты, которые вы найдете jsperf.com/regexp-test-vs-match-m5
  • 0
    @ Ajax333221. Спасибо за jsperf, но я не уверен, что это хорошо. Соответствие регулярному выражению использует группу соответствия, которая не нужна при поиске логического значения.
Теги:
performance

2 ответа

332
Лучший ответ

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

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

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% в зависимости от браузера:

Изображение 4759

Заключение

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

  • 5
    Не слишком удивлен, поскольку строковая функция должна перевернуть вещи и затем создать массив, если есть совпадение. Похоже, я буду продолжать использовать .test() . :)
  • 0
    как насчет perf для фактического извлечения значения .... также почему бы не добавить третий случай для .exec ().
Показать ещё 8 комментариев
68

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

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

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

  • 16
    Я просто била головой, видя, что мой regex.test () случайно записывает в журнал «true», затем «false», а затем «true» ... спасибо!
  • 6
    Я думаю, что это лучший ответ. Это объясняет, что они не дают тот же результат, и что reg.test () имеет опасную ловушку. Для меня это делает string.match () очевидным выбором. Производительность никогда не была для меня проблемой.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню