Регулярные выражения в 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
Комментарии к статье