Регулярные выражения

В JavaScript есть несколько способов проверить, удовлетворяет ли строка заданному шаблону:

// 1. Объявляем объект в виде регулярного выражения
var RegExp = '/script/gi';
// и ищем в элементе массива совпадение с заданным шаблоном
items[i].nodeName.search(RegExp);

// 2. можно просто проверять соответствие строке,
// а не искать индекс подстроки
items[i].nodeName.match(RegExp);

// 3. Можно обойтись без объявления самого регулярного выражения
items[i].nodeName.match(/script/gi);

// 4. Можно задавать регулярное выражение без глобального модификатора,
// ведь мы ищем любое (=первое) совпадение шаблона

items[i].nodeName.match(/script/i);

// 5. С тем же успехом мы можем выполнить шаблон
script/i.exec(items[i].nodeName);

// 6. Наконец, можно протестировать сам шаблон на нахождение в строке
script/i.test(items[i].nodeName);

Давайте рассмотрим, что из них работает быстрее всего. Для этого запустим немного модифицированный набор тестов из раздела выше (опять по 10000 раз для всего DOM-дерева). Получим следующие результаты:

Браузер search match «На лету» Локальный exec test
Firefox 3.0.3 2120 2041 1295 1273 1225 1348
Safari 3.1.2 453 469 344 359 360 359

Opera 9.61 2141 2063 406 344 312 313
IE 6 2594 2516 1875 1859 1953 1906
IE 7 2562 2469 1859 1844 2000 1860
IE 8b2 2140 2032 1453 1453 1547 1469
Chrome 0.2 856 870 416 397 385 392

Таблица 7.4. Различные варианты выполнения регулярного выражения, результаты в миллисекундах

Как мы видим, в данном случае создание нового регулярного выражения — весьма ресурсоемкий процесс, поэтому в большинстве случаев лучше обходиться без него. В остальном все браузеры ведут себя достаточно ровно при сопоставлении match, exec и test.