Открыть меню    

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

Экземпляр объекта типа RegExp

new RegExp(pattern[, flags])

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

регелярное выражение ЗАРАНЕЕ

известно, то предпочтительнее синтаксис литерала (/test/i).

Если же регулярное выражение заранее неизвестно, то предпочтительнее создавать регулярное выражение (в символьной строке) при помощи конструктора (new RegExp).

Но обратите внимание, так как "знак косой черты" \ играет роль переключения кода, то в строковом литереале (new RegExp) его приходится писать дважды: \\

Флаги

i игнорирование регистра при сопоставлении

g глобальное сопоставление, в отличие от локального (по умолчанию, совпадение только с первым экземпляром шаблоном) допускает совпадения со всеми экземплярами шаблона

Операторы

Что Как Описиние Использование
i флаг делает рег. выражение не зависящим от регистра /testik/i
g флаг глобальный поиск /testik/g
m флаг допускает сопоставление со многими строками, которые могут быть получены из textarea
[] оператор класса символов сопоставление с набором символов [az] - любой символ в интервале от a до z;
^ оператор знак вставки кроме [^a-z] - любой символ КРОМЕ символов в интервале от a до z;
- оператор дефис указываем диапозон значений, включительно [a-z] - любой символ в интервале от a до z;
\ оператор экранирования экранирует любой следующий символ \\
^ оператор начала сопоставления сопоставление с шаблоном должно произойти в начале /^testik/g
$ оператор конца сопоставления сопоставление с шаблоном должно произойти в конце /testik$/g
? оператор ? делает символ необязательным /t?est/g
+ оператор + символ должен присутстовать однократно или многократно /t+est/g
+ оператор + символ должен присутстовать однократно или многократно /t+est/g
* оператор * символ должен присутстовать однократно или многократно или вообще отсутствовать /t+est/g
{} оператор {} задаем фиксированное число повторений символа /t{4}est/g
{,} оператор {,} задаем число повторений символа в определенных пределах /t{4,9}est/g

Предопределенные классы символов

Предопределенный член Сопоставление
\t горизонтальная табуляция
\n Перевод строки
. Любой символ, кроме Перевода строки
\d Любая десят-я цифра, что равнозначно [0-9]
\D Любой символ, кроме десят-я цифры, что равнозначно [^0-9]
\w Любой символ (цифры, буквы и знак подчеркивания) что равнозначно [A-Za-z0-9]
\W Любой символ, кроме цифр, букв и знака подчеркивания, что равнозначно [^A-Za-z0-9]
\s Любой символ пробела
\S Любой символ, кроме пробела
\b Граница слова
\B НЕ Граница слова, а его внутр. часть

Группирование ( )

Если оператор, например, + (/(abcd)+/) требуется применить к группе члеров, то можно воспользоваться круглыми скобками ( ).

Фиксации

Часть регулярного выражения, заключенная в круглые скобки (), назывыется фиксацией.

Обратные ссылки на фиксации обозначаются обратной косой чертой (\) и номером фиксации, например, \1, \2.

Рассмотрим следующий пример:

/^([abc])k\1/

\1 это не любой символ из a, b, c.
\1 это какой угодно символ, который инициирует совпадение с первым символом. То есть символ совпавший с \1 неизвестен до разрешения регулярного выражения.

Нефиксируемые группы

Скобки ( ) используются в 2-х случаях: для группирования и для обозначение фиксаций. Но бывают ситуации, когда нам нужно использовать ( ) только для группирования, так как фиксация не требуется, кроме того, убирая лишние фиксации мы облегчаем работу механизму обработки регулярных выражений.

Итак, чтобы предотвратить фиксацию перед открывающей круглой скобкой необходимо поставить: ?:

str = "<div class='test'><b>Hello</b> <i>world!</i></div>";
found = str.match(/<(?:\/?)(?:\w+)(?:[^>]*?)>/i);
console.log("found without fix: ", found);
// [ "<div class='test'>" ]

Пример на jsfiddle.net

Функция test

Regexp.test([str])

Функция test проверяет, есть ли совпадение регулярного выражения со строкой (str). Возвращает или true или false.

Пример использования:

Javascript

function codeF(str){
        return /^\d{5}-\d{2}/.test(str);
    }

    //console.log(codeF('12345-12ss')); // true
    //console.log(codeF('1245-12ss')); // false

Функция match

str.match(regexp)

Функция match возвращает массив значений или null, если совпадений не найдено. Отметьте: если в регулярном выражении отсутствует флаг g (для выполнения глобального поиска), то метод match вернет первое совпадение в строке, при этом, как видно из примера, в массив совпадений попадают ФИКСАЦИИ (часть регулярного выражения заключенная в круглые скобки).

Javascript

str = "За информацией обратитесь: Глава 3.4.5.1";
re = /глава (\d+(\.\d)*)/i   // с фиксациями (без глобального флажка)
found = str.match(re)
console.log(found);
// ["Глава 3.4.5.1", "3.4.5.1", ".1"]

Если же предоставить методу match() глобальное регулярное выражение (с флажком g), то будет возвращен также массив, но с ГЛОБАЛЬНЫМИ совпадениями. То есть зафиксированные результаты не возвращаются.

Javascript

str = "За информацией обратитесь: Глава 3.4.5.1, Глава 7.5";
re = /глава (\d+(\.\d)*)/ig   // без фиксаций - глобально
found = str.match(re)
console.log(found); //  ["Глава 3.4.5.1", "Глава 7.5"]

Пример на jsfiddle.net

Функция exec

regexp.exec(str)

Функция exec проверяет, есть ли совпадение регулярного выражения со строкой (str). Возвращает массив результатов (с фиксациями) или null. При каждом последующем вызове метода exec (например, при использовании while) происходит (за счет автоматического обновления при выполнении exec индекса конца последнего поиска lastIndex) переход к следующему глобальному совпадению (если у казан флажок g).

Javascript

var html = "<div class='test'><b>BAM!</b> <em>BUM!</em></div>";
var reg = /<(\/?)(\w+)([^>]*?)>/g;

//console.log(reg.exec(html));  // ["<div class='test'>", "", "div", " class='test'"]

while((match = reg.exec(html)) !== null){
    console.log(reg.exec(html));
}

/*
["<b>", "", "b", ""]
["<em>", "", "em", ""]
["</div>", "/", "div", ""]
*/

Без глобального флажка методы match и exec работают идентично. То есть возвращают массив с первым глобальным совпадением и фиксациями.

Javascript

// match
var html = "<div class='test'><b>BAM!</b> <em>BUM!</em></div>";
var reg = /<(\/?)(\w+)([^>]*?)>/;  // без глобального
console.log(html.match(reg));  // ["<div class='test'>", "", "div", " class='test'"]

// exec
var html = "<div class='test'><b>BAM!</b> <em>BUM!</em></div>";
var reg = /<(\/?)(\w+)([^>]*?)>/;  // без глобального
console.log(reg.exec(html));  // ["<div class='test'>", "", "div", " class='test'"]

Функция replace

str.replace(regexp, newSubStr|function)
  • regexp - рег. выражение;
  • newSubStr - строка, на которую меняется найденное выражение в тексте;
  • function - вызывается для каждого обнаруженного совпадения с переменным списком параметров (напомним, что при глобальном поиске в строке обнаруживаются все экземпляры совпадения с шаблоном).

Возвращаемое значение данной функции служит в качестве замены.

Параметры функции:

  • 1 - Полная совпавшая подстрока.
  • 2 - Значение скобочных групп (фиксаций).
  • 3 - Индекс (позиция) совпадения в исходной строке.
  • 4 - Исходная строка.

Mетод не меняет вызывающую строку, а возвращает новую, после замены совпадений. Чтобы произвести глобальный поиск и замену, используйте regexp c флагом g.

"GHGHGHGTTTT".replace(/[A-Z]/g,"K"); //"KKKKKKKKKKK"

Javascript

function upLetter(allStr,letter)
{
    return letter.toUpperCase();
}
var res = "border-top-width".replace(/-(\w)/g, upLetter);

console.log(res); //borderTopWidth

С помощью метода replace можно получить ссылки на фиксации. В функцию вторым параметром передается номер фиксации; используется синтаксис вида: $1, $2, $3 и т.д.

Javascript

console.log("GHGHGHGTTTT".replace(/([A-Z])/g,"$1").toLowerCase());  // ghghghgtttt

Комментарии к статье