Регулярные выражения специальные символы. Руководство по регулярным выражениям в JavaScript

В JavaScript регулярные выражения представлены объектами RegExp . Объекты RegExp могут быть созданы посредством конструктора RegExp(), но чаще они создаются с помощью специального синтаксиса литералов. Так же как строковые литералы задаются в виде символов, заключенных в кавычки, литералы регулярных выражений задаются в виде символов, заключенных в пару символов слэша / .

/pattern/флаги new RegExp("pattern"[, опции поиска])

pattern - регулярное выражение для поиска (о замене - позже), а флаги - строка из любой комбинации символов g(глобальный поиск), i(регистр неважен) и 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 повторений элемента.
Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире. Например, - то же самое, что . Найдет "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 находит цифру из любого алфавита (у нас же юникод). Испльзуйте , чтобы найти только обычные цифры. Например, /\d/ или // найдет "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 Найдет любой словесный (латинский алфавит) символ, включая буквы, цифры и знак подчеркивания. Эквивалентно . Например, /\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 - шаблон замены, может принитать значения строки, шаблона замены, функции (имя функции).

Спецсимволы в строке заменыЗамена через функцию

Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении. В функции можно динамически генерировать и возвращать строку подстановки. Первый параметр функции - найденная подстрока. Если первым аргументом replace является объект RegExp, то следующие n параметров содержат совпадения из вложенных скобок. Последние два параметра - позиция в строке, на которой произошло совпадение и сама строка.

Регулярные выражения - одно из самых мощных средств обработки данных в JavaScript . Кроме того, это самый удобный способ обработки данных в случаях, когда точный шаблон поиска задать невозможно. Простейший пример - надо выделить в тексте все адреса электронной почты и номера телефонов. Очевидно, что простым поиском подстроки обойтись не удастся, т.к. мы заранее не знаем какие именно адреса и телефоны встетятся в тексте.

Регулярные выражения оперируют не точными значениями, а шаблонами. Шаблон (pattern) записывается при помощи языка регулярных выражений и с его основами мы сейчас познакомимся.

Итак, любое регулярное выражение состоит из разделителя, тела шаблона и модификаторов (иногда их ещё называют переключателями, switches).

/pattern/switch

Здесь "/" - это разделитель, "pattern" - тело шаблона, а "switch" - модификаторы.

В JavaScript возможно всего два пути использования регулярных выражений: с помощью методов объекта RegExp или с помощью методов объекта String.

Экземпляр объекта RegExp может создаваться двумя способами - явным и косвенным:

// явный способ var re = new RegExp("pattern", "switch"); // косвенный (альтернативный) способ var re = /pattern/switch;

Обратите внимание, что при косвенном способе шаблон задаётся БЕЗ кавычек.

Любое регулярное выражение состоит из обычных символов, спецсимволов и квантификаторов повторения. В качестве обычных символов выступают буквы, цифры и символьные знаки, при этом в качестве символов можно использовать национальные символы и символы в Unicode. Внимание! "Пробел" в регулярных выражениях тоже считается значимым, поэтому будьте очень внимательны при добавлении пробелов в выражение. А лучше воспользуйтесь специальным метасимволом (смотрите символ \s в таблице ниже).

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

Спецсимвол Соответствие в шаблоне
\ Для символов, которые обычно трактуются буквально, означает, что следующий символ является специальным. Например, /n/ соответствует букве n, а /\n/ соответствует символу перевода строки. Для символов, которые обычно трактуются как специальные, означает, что символ должен пониматься буквально. Например, /^/ означает начало строки, а /\^/ соответствует просто символу ^. /\\/ соответствует обратной косой черте \.
^ Соответствует началу строки.
$ Соответствует концу строки.
(pattern) Соответствует строке pattern и запоминает найденное соответствие.
(?:pattern) Соответствует строке pattern, но не запоминает найденное соответствие. Используется для группировки частей образца, например, /ко(?:т|шка)/ - это краткая запись выражения /кот|кошка/.
(?=pattern) Соответствие с "заглядыванием вперед", происходит при соответствии строки pattern без запоминания найденного соответствия. Например, /Windows (?=95|98|NT|2000)/ соответствует "Windows " в строке "Windows 98", но не соответствует в строке "Windows 3.1". После сопоставления поиск продолжается с позиции, следующей за найденным соответствием, без учета заглядывания вперед.
(?!pattern) Соответствие с "заглядыванием вперед", происходит при несоответствии строки pattern без запоминания найденного соответствия. Например, /Windows (?!95|98|NT|2000)/ соответствует "Windows " в строке "Windows 3.1", но не соответствует в строке "Windows 98". После сопоставления поиск продолжается с позиции, следующей за найденным соответствием, без учета заглядывания вперед.
x|y Соответствует x или y.
Соответствует любому символу из заключенных в квадратные скобки.
[^xyz] Соответствует любому символу, кроме заключенных в квадратные скобки.
Соответствует любому символу в указанном диапазоне.
[^a-z] Соответствует любому символу, кроме лежащих в указанном диапазоне.
\b Соответствует границе слова, т. е. позиции между словом и пробелом или переводом строки.
\B Соответствует любой позиции, кроме границе слова.
\сX Соответствует символу Ctrl+X. Например, /\cI/ эквивалентно /\t/
\d Соответствует цифре. Эквивалентно .
\D Соответствует нецифровому символу. Эквивалентно [^0-9].
\f Соответствует символу перевода формата (FF).
\n Соответствует символу перевода строки (LF).
\r Соответствует символу возврата каретки (CR).
\s Соответствует символу пробела. Эквивалентно /[ \f\n\r\t\v]/.
\S Соответствует любому непробельному символу. Эквивалентно /[^ \f\n\r\t\v]/.
\t Соответствует символу табуляции (HT).
\v Соответствует символу вертикальной табуляции (VT).
\w Соответствует латинской букве, цифре или подчеркиванию. Эквивалентно / /.
\W Соответствует любому символу, кроме латинской буквы, цифры или подчеркивания. Эквивалентно /[^A-Za-z0-9_] /.
\n n - положительное число. Соответствует n-ной запомненной подстроке. Вычисляется путем подсчета левых круглых скобок. Если левых скобок до этого символа меньше, чем n, то эквивалентно \0n.
\0n n - восьмеричное число, не большее 377. Соответствует символу с восьмеричным кодом n. Например, /\011/ эквивалентно /\t/.
\xn n - шестнадцатеричное число, состоящее из двух цифр. Соответствует символу с шестнадцатеричным кодом n. Например, /\x31/ эквивалентно /1/.
\un n - шестнадцатеричное число, состоящее из четырех цифр. Соответствует символу Unicode с шестнадцатеричным кодом n. Например, /\u00A9/ эквивалентно /©/.
. Точка. Соответствует любому символу.

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

Вторая составляющая шаблона - квантификаторы. Это подмножество спецсимволов, задающее условие повторения символов или их групп. Квантификатор записывается справа от выражения и распространяется на ближайший символ или группу. Например:

(pattern_1)|(pattern_2){quont}

Здесь квантификатор "quont" относитcя только к "pattern_2".

В таблице приведены все основные квантификаторы:

Квантификатор Соответствие в шаблоне
* Соответствует повторению предыдущего символа нуль или более раз.
+ Соответствует повторению предыдущего символа один или более раз.
? Соответствует повторению предыдущего символа нуль или один раз. . Соответствует любому символу, кроме символа новой строки.
{n} n - неотрицательное число. Соответствует ровно n вхождениям предыдущего символа.
{n,} n - неотрицательное число. Соответствует n или более вхождениям предыдущего символа. /x{1,}/ эквивалентно /x+/. /x{0,}/ эквивалентно /x*/.
{n,m} n и m - неотрицательное числа. Соответствует не менее чем n и не более чем m вхождениям предыдущего символа. /x{0,1}/ эквивалентно /x?/.

Итак, с основами языка регулярных выражений мы познакомились и теперь опробуем новые знания на практике. Вот пример использования метода test()

var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин*/; var result = re.test(sample) ? "" " : "" не "; document.write("Строка "" + sample + result + "соответствует образцу " + re);

Пример использования метода exec()

var sample = "Из апельсинов делают апельсиновый сок"; var re = /апельсин*/; var result = re.exec(sample); document.write("Найдено совпадение: "" + result + """);

А в этом примере мы воспользуемся альтернативным способом создания объекта RegExp:

var sample = "Из апельсинов делают апельсиновый сок"; var result = /апельсин*/.test(sample) ? "" " : "" не "; document.write("Строка "" + sample + result + "соответствует образцу ");

Следующий пример - реально действующий скрипт. Он позволяет избавиться от бага с отображением прозрачности PNG-картинок в Internet Explorer версии 5 и 6. Этот скрипт уже упоминался нами при рассмотрении слоёв и их применения в JavaScript.

Function correctPNG() { // проверяем строку подписи браузера пользователя if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)) { for(var i=0; i