Конспект JS-course

RegExp

Источник: http://javascript.ru/RegExp

Создание

// полная форма записи
var expr = new RegExp(pattern [, flags]);

// сокращенная форма записи (литеральный формат)
var expr = /pattern/flags;

Аргументы

  • pattern Шаблон поиска (текст регулярного выражения).
  • flags Способы поиска по шаблону:

    • g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска);
    • i — не различать строчные и заглавные буквы;
    • m — многострочный поиск.

Порядок указания флагов не имеет значения.

Описание, примеры

Когда регулярное выражение создается при помощи конструктора new RegExp(…), необходимо помнить, что обратные слеши (\) должны экранироваться, например:

var expr = new RegExp('\\w', 'ig');

При использовании литерального формата, этого делать не нужно:

var expr = /\w/gi;

Обе записи эквивалентны. Первый вариант может понадобится, если вам придется генерировать регулярное выражение динамически.

Виды символов

В регулярных выражениях различают следующие виды символов:

Обычные символы

  • A..z — английские буквы от A до z, строчные и заглавные;
  • 0..9 — цифры;
  • { } — фигурные скобки, кроме случаев, когда они составляют группу вида {n,m} (где n и m — числа) и её вариации;
  • = — равно;
  • < — меньше;
  • > — больше;
  • - — минус;
  • , — запятая;
  • и др.

Специальные символы

  • ( ) — круглые скобки;
  • [ ] — квадратные скобки;
  • \ — обраный слеш;
  • . — точка;
  • ^ — степень;
  • $ — знак доллара;
  • | — вертикальная черта;
  • ? — вопросительный знак;
  • + — плюс.

Спецсимволы в регулярном выражении

(Прим. автора конспекта) Из-за особенностей построения таблиц символ | будет заменен на *прямой слэш*.

Символ Значение
\ Для обычных символов - делает их специальными. Например, выражение /s/ ищет просто символ 's'. А если поставить \ перед s, то /\s/ уже обозначает пробельный символ.И наоборот, если символ специальный, например *, то \ сделает его просто обычным символом "звездочка". Например, /a*/ ищет 0 или больше подряд идущих символов 'a'. Чтобы найти а со звездочкой 'a*' - поставим \ перед спец. символом: /a\*/.
^ Обозначает начало входных данных. Если установлен флаг многострочного поиска ("m"), то также сработает при начале новой строки.Например, /^A/ не найдет 'A' в "an A", но найдет первое 'A' в "An A."
$ Обозначает конец входных данных. Если установлен флаг многострочного поиска, то также сработает в конце строки.Например, /t$/ не найдет 't' в "eater", но найдет - в "eat".
* Обозначает повторение 0 или более раз. Например, /bo*/ найдет 'boooo' в "A ghost booooed" и 'b' в "A bird warbled", но ничего не найдет в "A goat grunted".
+ Обозначает повторение 1 или более раз. Эквивалентно {1,}. Например, /a+/ найдет 'a' в "candy" и все 'a' в "caaaaaaandy".
? Обозначает, что элемент может как присутствовать, так и отсутствовать. Например, /e?le?/ найдет 'el' в "angel" и 'le' в "angle." Если используется сразу после одного из квантификаторов *, +, ?, или {}, то задает "нежадный" поиск (повторение минимально возможное количество раз, до ближайшего следующего элемента паттерна), в противоположность "жадному" режиму по умолчанию, при котором количество повторений максимально, даже если следующий элемент паттерна тоже подходит.Кроме того, ? используется в предпросмотре, который описан в таблице под (?=), (?!), и (?: ).
. (Десятичная точка) обозначает любой символ, кроме перевода строки: \n \r \u2028 or \u2029. (можно использовать [\s\S] для поиска любого символа, включая переводы строк). Например, /.n/ найдет 'an' и 'on' в "nay, an apple is on the tree", но не 'nay'.
(x) Находит x и запоминает. Это называется "запоминающие скобки". Например, /(foo)/ найдет и запомнит 'foo' в "foo bar." Найденная подстрока хранится в массиве-результате поиска или в предопределенных свойствах объекта RegExp: $1, ..., $9.Кроме того, скобки объединяют то, что в них находится, в единый элемент паттерна. Например, (abc)* - повторение abc 0 и более раз.
(?:x) Находит x, но не запоминает найденное. Это называется "незапоминающие скобки". Найденная подстрока не сохраняется в массиве результатов и свойствах RegExp.Как и все скобки, объединяют находящееся в них в единый подпаттерн.
x(?=y) Находит x, только если за x следует y. Например, /Jack(?=Sprat)/ найдет 'Jack', только если за ним следует 'Sprat'. /Jack(?=Sprat *прямой слэш* Frost)/ найдет 'Jack', только если за ним следует 'Sprat' или 'Frost'. Однако, ни 'Sprat' ни 'Frost' не войдут в результат поиска.
x(?!y) Соответствует 'x' только если за 'x' не следует 'y'. Это называется отрицательное упреждение. Например, /\d+(?!\.)/ соответствует числу только если за ним не следует десятичная точка. Регулярное выражение /\d+(?!\.)/.exec("3.141") сопоставит '141', но не '3.141'.
x *прямой слэш* y Соответствует либо 'x' либо 'y'. Например, /green *прямой слэш* red/ соответствует 'green' в "green apple" и 'red' в "red apple."
{n} n - положительное целое. Соответствует ровно n вхождениям предыдущего символа. Например, /a{2}/ не соответствует 'a' в "candy," но соответствует всем а в "caandy", первым двум а в "caaandy."
{n,m} m и n - положительные целые. Соответствует как минимум n и максимум m вхождениям предыдущего символа. При m=n=0 пропускается. Например, /a{1,3}/ ничему не соответствует в строке "cndy", символу 'a' в "candy", двум а в "caandy", и трем первым а в "caaaaaaandy". Отметим, что при сопоставлении "caaaaaaandy", совпадает "aaa", хотя изначальная строка содержит больше а.
[xyz] Набор символов. Соответствует любому символу из перечисленных. Можно указать диапазон символов используя тире. Специальные символы (как точка (.) и звездочка (*)) не имеют специального значения внутри такого набора.Их не надо экранировать. Экранирование работает так же. Например, [abcd] эквивалентна [a-d]. Они соответствуют 'b' в "brisket" и 'c' в "city". /[a-z.]+/ и /[\w.]+/ обе соответствуют всему в "test.i.ng".
[^xyz] Инвертированный или дополняющий набор символов. Это означает соответствие всему, что не в скобках. Можно указать диапазон символов с помощью тире. Все, что действует в обычном наборе символов, действует и здесь. Например, [^abc] эквивалентно [^a-c]. Они соответствуют изначально 'r' в "brisket" и 'h' в "chop."
[\b] Соответствует бэкспейсу (U+0008). (Не путать с \b.)
\b Находит границу слов (латинских), например пробел. (Не путать с [\b]). Например, /\bn\w/ найдет 'no' в "noonday"; /\wy\b/ найдет 'ly' в "possibly yesterday."
\B Обозначает не границу слов. Например, /\w\Bn/ найдет 'on' в "noonday", а /y\B\w/ найдет 'ye' в "possibly yesterday."
\cX Где X - буква от A до Z. Обозначает контрольный символ в строке. Например, /\cM/ обозначает символ Ctrl-M.
\d Соотвествует цифровому символу. Эквивалентно выражению [0-9]. Например, /\d/ or /[0-9]/ соотвествует '2' в "B2 is the suite number."
\D Найдет нецифровой символ (все алфавиты). [^0-9] - эквивалент для обычных цифр. Например, /\D/ или /[^0-9]/ найдет 'B' в "B2 is the suite number."
\f Соотвествует символу прогона страницы (U+000C). Особый символ управления печатью.
\n Соотвествует символу перевода строки (U+000A).
\r Соотвествует символу возврата каретки (U+000D).
\s Соотвествует одиночному символу пустого пространства, включая пробел, табуляция, прогон страницы, перевод строки. Эквивалентен [ \f\n\r\t\v\u00A0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u2028\u2029\u202f\u205f\u3000]. Например, /\s\w*/ совпадает с ' bar' в "foo bar."
\S Соотвествует одничному символу непустого пространства. Эквивалентен [^ \f\n\r\t\v\u00A0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u2028\u2029\u202f\u205f\u3000]. Например, /\S\w*/ совпадает с 'foo' в "foo bar."
\t Соотвествует символу горизонтальной табуляции (U+0009).
\v Соотвествует символу вертикальной табуляции (U+000B).
\w Соотвествует любому цифробуквенному символу включая нижнее подчеркивание. Эквивалентен [A-Za-z0-9_]. Например, /\w/ совпадает с 'a' в "apple," '5' в "$5.28," и '3' в "3D."
\W Соотвествует любому нецифробуквенному символу. Равносилен [^A-Za-z0-9_]. Например, /\W/ or /[^A-Za-z0-9_]/ совпадает с '%' в "50%."
\0 Найдет символ NUL. Не добавляйте в конец другие цифры.
\xhh Найдет символ с кодом hh (2 шестнадцатиричных цифры)
\uhhhh Найдет символ с кодом hhhh (4 шестнадцатиричных цифры).

Пример: изменение формата строки

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
alert(newstr); // "Smith, John"

Методы

Свойства

См. также

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