Регулярные выражения в JavaScript
Описание
В JavaScript регулярные выражения представлены объектами RegExp. Объекты RegExp могут быть созданы посредством конструктора RegExp(), но чаще они создаются с помощью специального синтаксиса литералов. Так же как строковые литералы задаются в виде символов, заключенных в кавычки, литералы регулярных выражений задаются в виде символов, заключенных в пару символов слэша /.
/pattern/флаги
new RegExp("pattern"[, опции поиска])
pattern - регулярное выражение для поиска (о замене - позже), а флаги - строка из любой комбинации символов g(глобальный поиск), i(регистр неважен) и m(многострочный поиск). Первый способ используется часто, второй - иногда. Например, два таких вызова эквивалентны.
Опции поиска
При создании регулярного выражения мы можем указать дополнительных опции поиска
i | ignore case | Не различать строчные и прописные буквы. |
g | global search | Глобальный поиск всех вхождений образца. |
m | multiline | Многострочный ввод должен рассматриваться как несколько строк. Если используется флаг m, то ^и $совпадают в начале и в конце любой строки общей строки ввода, вместо начала и конца всей строки ввода. |
Символы в регулярных выражениях JavaScript
| Символ | Соответствие |
|---|---|
| Алфавитно-цифровые символы | Соответствуют сами себе |
\0 | Символ NUL (\u0000) |
\t | Табуляция (\u0009) |
\n | Перевод строки (\u000A) |
\v | Вертикальная табуляция (\u000B) |
\f | Перевод страницы (\u000C) |
\r | Возврат каретки (\u000D) |
\xnn | Символ из набора Latin, задаваемый шестнадцатеричным числом nn; например, \x0A - это то же самое, что \n |
\uxxxx | Unicode-символ, заданный шестнадцатеричным числом xxxx; например, \u0009 - это то же самое, что \t |
\cX | Управляющий символ "X", например, последовательность \cJ эквивалентна символу перевода строки \n |
\ | Для обычных символов - делает их специальными. Например, выражение /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," но найдет оба a в "caandy," и первые два a в "caaandy." |
{n,} | Где n - положительное целое число. Находит n и более повторений элемента. Например, /a{2,}не найдет 'a' в "candy", но найдет все 'a' в "caandy" и в "caaaaaaandy." |
{n,m} | Где n и m - положительные целые числа. Находят от n до m повторений элемента. |
[xyz] | Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире. Например, [abcd]- то же самое, что [a-d]. Найдет 'b' в "brisket", а также 'a' и 'c' в "ache". |
[^xyz] | Любой символ, кроме указанных в наборе. Вы также можете указать промежуток. Например, [^abc]- то же самое, что [^a-c]. Найдет 'r' в "brisket" и 'h' в "chop." |
[\b] | Находит символ backspace. (Не путать с \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/ или /[0-9]/найдет '2' в "B2 is the suite number." |
\D | Найдет нецифровой символ (все алфавиты). [^0-9]- эквивалент для обычных цифр. Например, /\D/или /[^0-9]/найдет 'B' в "B2 is the suite number." |
\s | Найдет любой пробельный символ, включая пробел, табуляцию, переводы строки и другие юникодные пробельные символы. Например, /\s\w*/найдет ' bar' в "foo bar." |
\S | Найдет любой символ, кроме пробельного. Например, /\S\w*/найдет 'foo' в "foo bar." |
\v | Символ вертикальной табуляции. |
\w | Найдет любой словесный (латинский алфавит) символ, включая буквы, цифры и знак подчеркивания. Эквивалентно [A-Za-z0-9_]. Например, /\w/найдет 'a' в "apple," '5' в "$5.28," и '3' в "3D." |
\W | Найдет любой не-(лат.)словесный символ. Эквивалентно [^A-Za-z0-9_]. Например, /\W/и /[^$A-Za-z0-9_]/одинаково найдут '%' в "50%." |
Работа с регулярными выражениями в Javascript
Работа с регулярными выражениями в Javascript реализована методами класса String
exec(regexp) - находит все совпадения (вхождения в шаблон "регулярки") в строке. Возвращает массив (при совпадении) и обновляет свойство regexp-а, или null - если ничего не найдено,. С модификатором g - при каждом вызове этой функции, она будет возвращать следующее совпадение после предыдущего найденного - это реализовано с помощью ведения индекса смещения последнего поиска.
match(regexp) - найти часть строки по шаблону. Если указан модификатор g, то функция match() возвращает массив всех совпадений или null (а не пустой массив). Без модификатора g эта функция работает как exec();
test(regexp) - функция проверяет строку на соответствие шаблону. Возвращает true- если есть совпадение, и false- если совпадения нет.
split(regexp) - разбивает строку, для которой он вызван, на массив подстрок, используя аргумент в качестве разделителя.
replace(regexp, mix) - метод возвращает строку изменную в соответствии с шаблоном (регуляррным выражением).
Первый параметр regexp также может содержать строку, а не регулярное выражение.
Без модификатора g- метод в строке заменяет только первое вхождение; с модификатором g- происходит глобальная замена, т.е. меняются все вхождения в данной строке.
mix- шаблон замены, может принитать значения строки, шаблона замены, функции (имя функции).
Спецсимволы в строке замены
$$ | Вставляет "$". |
$& | Вставляет найденную подстроку. |
$` | Вставляет часть строки, которая предшествует найденному вхождению. |
$' | Вставляет часть строки, которая идет после найденного вхождения. |
$ or $ | Где или - десятичные цифры, вставляет подстроку вхождения, запомненную n-й вложенной скобкой, если первый аргумент - объект RegExp. |
Замена через функцию
Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении. В функции можно динамически генерировать и возвращать строку подстановки. Первый параметр функции - найденная подстрока. Если первым аргументом replace является объект RegExp, то следующие n параметров содержат совпадения из вложенных скобок. Последние два параметра - позиция в строке, на которой произошло совпадение и сама строка.
function styleHyphenFormat(propertyName)
function upperToHyphenLower(match)
{
return '-' + match.toLowerCase();
}
return propertyName.replace(/[A-Z]/, upperToHyphenLower);
}
//преобразовать borderTop к border-top:
styleHyphenFormat('borderTop');