Поиск по регулярным выражениям в браузере
- Объект RegExp
- Спецсимволы в регулярном выражении
- Проверка результатов: метод test
- Поиск совпадений: метод exec
- Строковые методы, поиск и замена
- Метод search(regexp)
- Метод match(regexp)
- Замена, replace
- Спецсимволы в строке замены
- Замена через функцию
Регулярные выражения в javascript имеют особую краткую форму и стандартный PCRE-синтаксис.
Работают они через специальный объект RegExp.
Кроме того, у строк есть свои методы search,match,replace, но чтобы их понять - разберем-таки сначала RegExp .
Объект RegExp
Объект типа RegExp , или, короче, регулярное выражение, можно создать двумя путями
pattern - регулярное выражение для поиска (о замене - позже), а флаги - строка из любой комбинации символов g (глобальный поиск), i (регистр неважен) и m (многострочный поиск).
Первый способ используется часто, второй - иногда. Например, два таких вызова эквивалентны:
При втором вызове - т.к регулярное выражение в кавычках, то нужно дублировать \
При поиске можно использовать большинство возможностей современного PCRE-синтаксиса.
Спецсимволы в регулярном выражении
Символ Значение \ Для обычных символов - делает их специальными. Например, выражение /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 или более раз. Эквивалентно . Например, /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 повторений предшествующего элемента. Например, /a/ не найдет 'a' в "candy," но найдет оба a в "caandy," и первые два a в "caaandy." Где n - положительное целое число. Находит n и более повторений элемента. Например, /a не найдет 'a' в "candy", но найдет все 'a' в "caandy" и в "caaaaaaandy." Где 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." \c X Где X - буква от A до Z. Обозначает контрольный символ в строке. Например, /\cM/ обозначает символ Ctrl-M. \d находит цифру из любого алфавита (у нас же юникод). Испльзуйте 4, чтобы найти только обычные цифры. Например, /\d/ или /5/ найдет '2' в "B2 is the suite number." \D Найдет нецифровой символ (все алфавиты). [^0-9] - эквивалент для обычных цифр. Например, /\D/ или /[^0-9]/ найдет 'B' в "B2 is the suite number." \f,\r,\n Соответствующие спецсимволы form-feed, line-feed, перевод строки. \s Найдет любой пробельный символ, включая пробел, табуляцию, переводы строки и другие юникодные пробельные символы. Например, /\s\w*/ найдет ' bar' в "foo bar." \S Найдет любой символ, кроме пробельного. Например, /\S\w*/ найдет 'foo' в "foo bar." \t Символ табуляции. \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%." \ n где n - целое число. Обратная ссылка на n-ю запомненную скобками подстроку. Например, /apple(,)\sorange\1/ найдет 'apple, orange,' в "apple, orange, cherry, peach.". За таблицей есть более полный пример. \0 Найдет символ NUL. Не добавляйте в конец другие цифры. \x hh Найдет символ с кодом hh (2 шестнадцатиричных цифры) \u hhhh Найдет символ с кодом hhhh (4 шестнадцатиричных цифры). Проверка результатов: метод test
Чтобы просто проверить, подходит ли строка под регулярное выражение, используется метод test :
Метод test начинает поиск, начиная со свойства lastIndex объекта RegExp , если оно установлено.
Поиск совпадений: метод exec
Метод exec возвращает массив и ставит свойства регулярного выражения.
Если совпадений нет, то возвращается null.В результате выполнения скрипта будут такие результаты:
Объект Свойство/Индекс Описания Пример myArray Содержимое myArray . ["dbBd", "bB", "d"] index Индекс совпадения (от 0) 1 input Исходная строка. cdbBdbsbz [0] Последние совпавшие символы dbBd [1], . [ n ] Совпадения во вложенных скобках, если есть. Число вложенных скобок не ограничено. [1] = bB
[2] = dmyRe lastIndex Индекс, с которого начинать следующий поиск. 5 ignoreCase Показывает, что был включен регистронезависимый поиск, флаг " i ". true global Показывает, что был включен флаг " g " поиска всех совпадений. true multiline Показывает, был ли включен флаг многострочного поиска " m ". false source Текст паттерна. d(b+)(d) Если в регулярном выражении включен флаг " g ", Вы можете вызывать метод exec много раз для поиска последовательных совпадений в той же строке. Когда Вы это делаете, поиск начинается на подстроке str , с индекса lastIndex . Например, вот такой скрипт:
Этот скрипт выведет следующий текст:
В следующем примере функция выполняет поиск по input. Затем делается цикл по массиву, чтобы посмотреть, есть ли другие имена.
Строковые методы, поиск и замена
Следующие методы работают с регулярными выражениями из строк.
Все методы, кроме replace, можно вызывать как с объектами типа regexp в аргументах, так и со строками, которые автоматом преобразуются в объекты RegExp.
Так что вызовы эквивалентны:
При использовании кавычек нужно дублировать \ и нет возможности указать флаги. Если регулярное выражение уже задано строкой, то бывает удобна и полная форма
Метод search(regexp)
Возвращает индекс регулярного выражения в строке, или -1.
Если Вы хотите знать, подходит ли строка под регулярное выражение, используйте метод search (аналогично RegExp-методы test ). Чтобы получить больше информации, используйте более медленный метод match (аналогичный методу RegExp exec ).
Метод match(regexp)
Если в regexp нет флага g , то возвращает тот же результат, что regexp.exec(string) .
Если в regexp есть флаг g , то возвращает массив со всеми совпадениями.
Чтобы просто узнать, подходит ли строка под регулярное выражение regexp , используйте regexp.test(string) .
Если Вы хотите получить первый результат - попробуйте r egexp.exec(string) .
В следующем примере match используется, чтобы найти "Chapter", за которой следует 1 или более цифр, а затем цифры, разделенные точкой. В регулярном выражении есть флаг i , так что регистр будет игнорироваться.
Скрипт выдаст массив из совпадений:
- Chapter 3.4.5.1 - полностью совпавшая строка
- 3.4.5.1 - первая скобка
- .1 - внутренняя скобка
Следующий пример демонстрирует использование флагов глобального и регистронезависимого поиска с match . Будут найдены все буквы от А до Е и от а до е, каждая - в отдельном элементе массива.
Замена, replace
Метод replace может заменять вхождения регулярного выражения не только на строку, но и на результат выполнения функции. Его полный синтаксис - такой:
regexp Объект RegExp. Его вхождения будут заменены на значение, которое вернет параметр номер 2 substr Строка, которая будет заменена на newSubStr . newSubStr Строка, которая заменяет подстроку из аргумента номер 1. function Функция, которая может быть вызвана для генерации новой подстроки (чтобы подставить ее вместо подстроки, полученной из аргумента 1).
Метод replace не меняет строку, на которой вызван, а просто возвращает новую, измененную строку.
Чтобы осуществить глобальную замену, включите в регулярное выражение флаг "g" .
Если первый аргумент - строка, то она не преобразуется в регулярное выражение, так что, например,
Вызов replace оставил строку без изменения, т.к искал не регулярное выражение \s , а строку "\s".
Спецсимволы в строке замены
В строке замены могут быть такие спецсимволы:
Pattern Inserts $$ Вставляет "$". $& Вставляет найденную подстроку. $` Вставляет часть строки, которая предшествует найденному вхождению. $' Вставляет часть строки, которая идет после найденного вхождения. $ n or $ nn Где n или nn - десятичные цифры, вставляет подстроку вхождения, запомненную n -й вложенной скобкой, если первый аргумент - объект RegExp. Замена через функцию
Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении.
В функции можно динамически генерировать и возвращать строку подстановки.
Первый параметр функции - найденная подстрока. Если первым аргументом replace является объект RegExp , то следующие n параметров содержат совпадения из вложенных скобок. Последние два параметра - позиция в строке, на которой произошло совпадение и сама строка.
Например, следующий вызов replace возвратит XXzzzz - XX , zzzz.
Как видите, тут две скобки в регулярном выражении, и потому в функции два параметра p1 , p2 .
Если бы были три скобки, то в функцию пришлось бы добавить параметр p3 .Следующая функция заменяет слова типа borderTop на border-top :
Статичные регэкспы
В некоторых реализациях javascript регэкспы, заданные коротким синтаксисом /. / - статичны. То есть, такой объект создается один раз в некоторых реализациях JS, например в Firefox. В Chrome все ок.
По стандарту эта возможность разрешена ES3, но запрещена ES5.
Из-за того, что lastIndex при глобальном поиске меняется, а сам объект регэкспа статичен, первый поиск увеличивает lastIndex , а последующие - продолжают искать со старого lastIndex , т.е. могут возвращать не все результаты.
При поиске всех совпадений в цикле проблем не возникает, т.к. последняя итерация (неудачная) обнуляет lastIndex .
Дополнительно
Для общего понимания регулярных выражений можно почитать Статью в wikipedia.
Более подробно они описаны в книге (англ.) Beginning Regular Expressions.
Приведенные ниже примеры показывают, как использовать и составлять простые регулярные выражения. Каждый пример содержит искомый текст, одно или несколько соответствующих ему регулярных выражений, а также примечания, поясняющие использование специальных символов и форматов.
Важно! Поддерживается только синтаксис RE2, который немного отличается от PCRE. Обратите внимание, что регулярные выражения по умолчанию вводятся с учетом регистра.
Примечание. На основе примеров, приведенных ниже, можно составлять более сложные регулярные выражения. Однако для поиска отдельных слов мы рекомендуем использовать параметры Соответствие содержания и Нежелательное содержание.
Пример 2: (\W|^)сборник\sзаконов(\W|$)
- \W соответствует любому символу, кроме букв, цифр и знака подчеркивания. Этот элемент исключает из поиска символы в начале или конце фразы.
- В примере 2 элемент \s соответствует пробелу, а указывает на то, что между словами сборник и законов может быть от 0 до 3 пробелов.
- ^ соответствует началу новой строки. Этот элемент позволяет искать с помощью регулярного выражения фразы, которые находятся в начале строки и перед которыми отсутствуют символы.
- $ соответствует окончанию строки. Этот элемент позволяет искать с помощью регулярного выражения фразы, которые находятся в конце строки и после которых отсутствуют символы.
- В примере 3 (s) соответствует букве и, а указывает на то, что эта буква может встречаться 0 или 1 раз в конце слова "сборник". Таким образом, регулярное выражение ищет словосочетание сборник законов и сборники законов. Другой вариант: вместо можно использовать символ "?".
- туфта
- проклятие
- убирайся
- бред
- черт возьми
- зараза
Элемент (. ) объединяет все слова, а класс символов \W применяется ко всем словам в круглых скобках.
(?i) делает выражение нечувствительным к регистру.
\W соответствует любому символу, кроме букв, цифр и знака подчеркивания. Этот элемент исключает из поиска символы в начале или конце слова или фразы из списка.
^ соответствует началу новой строки. Этот элемент позволяет искать с помощью регулярного выражения слова, которые находятся в начале строки и перед которыми отсутствуют символы.
$ соответствует окончанию строки. Этот элемент позволяет искать с помощью регулярного выражения слова, которые находятся в конце строки и после которых отсутствуют символы.
Знак | соответствует оператору "или"; таким образом, регулярное выражение будет искать каждое слово из списка по отдельности.
\s соответствует пробелу. Этот символ используется для разделения слов в фразе.
- ви@гра
- веагра
- ве@гра
- в№@гр@
- Элемент \W не используется, так как до и после любых вариантов написания слова виагра могут быть расположены другие символы. Например, регулярное выражение будет искать слово виагра в следующем тексте:
виагра!! или ***виагра***
- \W соответствует любому символу, кроме букв, цифр и знака подчеркивания. Этот элемент исключает из поиска символы в начале или конце адреса электронной почты.
- ^ соответствует началу новой строки. Этот элемент позволяет искать с помощью регулярного выражения адреса, которые находятся в начале строки и перед которыми отсутствуют символы.
- $ соответствует окончанию строки. Этот элемент позволяет искать с помощью регулярного выражения адреса, которые находятся в конце строки и после которых отсутствуют символы.
- Элемент [\w.\-] соответствует любому словообразующему символу (a-z, A-Z, 0-9 и знаку подчеркивания), точке или дефису. Эти символы используются чаще всего в первой части адреса электронной почты. Обратите внимание, что элемент \-, обозначающий дефис, должен находиться в конце списка символов, заключенных в квадратные скобки.
- Знак \ перед дефисом и точкой исключает эти символы из поиска, т. е. указывает, что тире и точка не являются специальными символами регулярного выражения. Обратите внимание, что экранировать точку, которая находится в квадратных скобках, не нужно.
- указывает на то, что перед символом @ может находиться набор символов, состоящий из 0–25 знаков. Настройки соответствия содержания в электронной почте поддерживают в регулярных выражениях наборы символов длиной до 25 знаков.
- Элемент (…) объединяет домены, а разделяющий их символ | соответствует оператору "или".
- Знак \ перед каждой точкой исключает ее из поиска, т. е. указывает, что точка не является специальным символом регулярного выражения.
- В примере 1 отсутствуют символы после последней точки, поэтому регулярное выражение будет искать все IP-адреса, которые начинаются с цифр 192.168.1., вне зависимости от последующих цифр.
- В примере 2 элемент \d соответствует любой цифре от 0 до 9 после последней точки, а указывает, что за последней точкой может следовать от 1 до 3 цифр. В этом случае регулярное выражение будет искать все полные IP-адреса, которые начинаются с цифр 192.168.1. Обратите внимание, что такое регулярное выражение также будет находить недопустимые IP-адреса, например 192.168.1.999.
Неиспользуемые символы в регулярных выражениях
Регулярные выражения со следующими символами не поддерживаются, так как могут привести к задержкам при обработке вашего письма:
Конструктор RegExp создаёт объект регулярного выражения для сопоставления текста с шаблоном.
Введение в то, что представляют собой регулярные выражения, читайте в главе «Регулярные выражения» в руководстве по JavaScript.
Интерактивный пример
Синтаксис
Возможны как литеральная запись, так и запись через конструктор:
Параметры
Если определён, может принимать любую комбинацию нижеследующих значений:
g глобальное сопоставление i игнорирование регистра при сопоставлении m сопоставление по нескольким строкам; символы начала и конца (^ и $) начинают работать по нескольким строкам (то есть, происходит сопоставление с началом или концом каждой строки (строки разделяются символами \n или \r), а не только с началом или концом всей вводимой строки) y Experimental «липкий» поиск; сопоставление в целевой строке начинается с индекса, на который указывает свойство lastIndex этого регулярного выражения (и не пытается сопоставиться с любого более позднего индекса).
Описание
Существует два способа создания объекта RegExp : литеральная запись и использование конструктора. При записи строк параметры в литеральной записи не используют символы кавычек, в то время как параметры функции-конструктора используют кавычки. Так что следующие выражения создают одинаковые регулярные выражения:
Литеральная запись обеспечивает компиляцию регулярного выражения при вычислении выражения. Используйте литеральную запись если регулярное выражение будет неизменным. Например, если вы используете литеральную запись для конструирования регулярного выражения, используемого в цикле, регулярное выражение не будет перекомпилироваться на каждой итерации.
Конструктор объекта регулярного выражения, например, new RegExp('ab+c') , обеспечивает компиляцию регулярного выражения во время выполнения. Используйте функцию-конструктор, если вы знаете, что шаблон регулярного выражения будет меняться или если вы не знаете шаблон и получаете его из внешних источников, например, из пользовательского ввода.
При использовании функции-конструктора необходимо использовать обычные правила экранирования в строках (предварять специальные символы символом обратного слеша «\»). Например, следующие выражения эквивалентны:
Значение специальных символов в регулярных выражениях
(Точка, десятичная запятая) сопоставляется с любым символом за исключением символов новой строки: \n , \r , \u2028 или \u2029 .
Обратите внимание, что флаг многострочности m не изменяет поведение точки. Так что для сопоставления с шаблона с несколькими строками используйте набор символов [^] (конечно, если только вам не нужно поддерживать старые версии IE), он сопоставляется с любым символом, включая символы новой строки.
Например, шаблон /.н/ сопоставляется с подстрокой «ан», но не подстрокой «ну», во фразе «ну что, потанцуем».
Сопоставляется с символом цифры в базовом латинском алфавите. Эквивалентен набору символов 2 .
Например, шаблоны /\d/ и /5/ сопоставляются с подстрокой «2» в строке «B2 — это номер люкс».
Сопоставляется с любым символом, который не является цифрой в базовом латинском алфавите. Эквивалентен набору символов [^0-9] .
Например, шаблоны /\D/ и /[^0-9]/ сопоставляются с подстрокой «B» в строке «B2 — это номер люкс».
Сопоставляется с любым алфавитно-цифровым символом из базового латинского алфавита, включая символ подчёркивания. Эквивалентен набору символов [A-Za-z0-9_] .
Например, шаблон /\w/ сопоставляется с подстрокой «a» в строке «apple», с подстрокой «5» в строке «$5.28» и с подстрокой «3» в строке «3D».
Сопоставляется с любым символом из базового латинского алфавита, не являющимся символом, из которых состоят слова. Эквивалентен набору символов [^A-Za-z0-9_] .
Например, шаблоны /\W/ и /[^A-Za-z0-9_]/ сопоставляются с подстрокой «%» в строке «50%».
Сопоставляется с одиночным пробельным символом, который включает в себя пробел, табуляцию, подачу страницы, перевод строки и другие пробельные символы Юникода. Эквивалентен набору символов [ \f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000] .
Например, шаблон /\s\w*/ сопоставляется с подстрокой « bar» в строке «foo bar».
Сопоставляется с одиночным символом, не являющимся пробельным. Эквивалентен набору символов [^ \f\n\r\t\v\u00a0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000] .
Например, шаблон /\S\w*/ сопоставляется с подстрокой «foo» в строке «foo bar».
Где X является буквой от «A» до «Z». Сопоставляется с управляющим символом в строке.
Например, шаблон /\cM/ сопоставляется с символом control-M в строке.
Для символов, которые обычно трактуются буквально, указывает, что следующий символ является специальным и не должен интерпретироваться буквально.
Например, шаблон /b/ сопоставляется с символом «b». Поместив перед ним символ обратного слеша, то есть превратив шаблон в /\b/ , символ приобретёт специальное значение, обозначающее сопоставление с границей слова.
Для символов, которые обычно трактуются специальным образом, указывает, что следующий символ не является специальным и должен интерпретироваться буквально.
Например, звёздочка «*» является специальным символом, обозначающим ноль или более вхождений предшествующего символа при сопоставлении; поэтому шаблон /a*/ означает сопоставление с нулём или более символов «a». Для буквального сопоставления со звёздочкой * предварите её символом обратного слеша; например, шаблон /a\*/ сопоставляется со строкой «a*».
Набор символов. Сопоставляется с любым из заключённых в квадратные скобки символов. С помощью дефиса вы можете определить диапазон символов.
Например, шаблон [абвгд] означает тоже самое, что и шаблон [а-д] . Они сопоставляются с символом «г» в слове «грудинка» и символом «б» в слове «отбивная».
Отрицательный или дополнительный набор символов. То есть он сопоставляется со всеми символами, что не заключены в квадратные скобки. С помощью дефиса вы можете определить диапазон символов.
Например, шаблон [^абвгд] означает тоже самое, что и шаблон [^а-д] . Они сопоставляются с символом «е» в слове «бекон» и символом «о» в слове «отбивная».
Сопоставляется c началом ввода. Если установлен флаг многострочности, также сопоставляется с позицией сразу за символом переноса строки.
Например, шаблон /^Б/ не сопоставляется с буквой «Б» в строке «буква Б», но сопоставляется с первой буквой «Б» в строке «Буква Б».
Сопоставляется c концом ввода. Если установлен флаг многострочности, также сопоставляется с позицией сразу перед символом переноса строки.
Например, шаблон /т$/ не сопоставляется с буквой «т» в слове «кормить», но сопоставляется с ней в слове «кормит».
Сопоставляется с границей слова нулевой ширины, например с позицией между буквой и пробелом (не путайте его с набором символов [\b] ).
Например, шаблон /\bпол/ сопоставляется с подстрокой «пол» в строке «в полдень»; шаблон /но\b/ сопоставляется с подстрокой «но» в строке «возможно завтра».
Сопоставляется с границей не-слов нулевой ширины, например с позицией между двумя буквами или двумя пробелами.
Например, шаблон /\Bдень/ сопоставляется с подстрокой «день» в строке «в полдень»; шаблон /за\B/ сопоставляется с подстрокой «за» в строке «возможно завтра».
Сопоставляется с x и запоминает сопоставление. Называется «захватывающие скобки».
Например, шаблон /(foo)/ сопоставляется с подстрокой «foo» и запоминает её в строке «foo bar». Сопоставленную подстроку можно достать из элементов [1], . [n] результирующего массива или из предопределённых свойств $1, . $9 объекта RegExp .
Захват групп ведёт к проседанию производительности. Если вам не нужно повторно ссылаться на захваченную подстроку, лучше использовать скобки без захвата (смотрите ниже).
Где n является целым положительным числом. Обратная ссылка на последнюю сопоставившуюся подстроку в n-ных по счёту круглых скобках в регулярном выражении (нумерация скобок идёт слева направо).
Например, шаблон /яблоко(,)\sапельсин\1/ сопоставится подстроке «яблоко, апельсин,» в строке «яблоко, апельсин, вишня, персик». Более подробный пример смотрите после этой таблицы.
Сопоставляется с предшествующим элементом x ноль или более раз.
Например, шаблон /ела*/ сопоставляется с подстрокой «ел» в строке «Призрак просвистел» и подстрокой «ела» в строке «Птица пропела», но ни с чем не сопоставится в строке «Козёл хмыкнул».
Сопоставляется с предшествующим элементом x один или более раз. Эквивалентен квантификатору .
Например, шаблон /о+/ сопоставляется с символом «о» в строке «конфета» и со всеми символами «о» в строке «коооооонфета».
Сопоставляется с предшествующим элементом x подобно квантификаторам * и + , описанным выше, однако ищет минимально возможное сопоставление.
Например, шаблон /".*?"/ сопоставляется с подстрокой «"foo"» в строке «"foo" "bar"» и не сопоставляется со строкой «"foo" "bar"», поскольку за звёздочкой * следует символ вопроса ? .
Сопоставляется с предшествующим элементом x ноль или один раз.
Например, шаблон /о?то?/ сопоставляется с подстрокой «от» в строке «кот» и подстрокой «то» в строке «ток».
Если символ используется сразу после какого-то из квантификаторов * , + , ? , или <> , то он делает этот квантификатор «нежадным» (сопоставление происходит минимально возможное количество раз), в противоположность «жадному» поведению квантификатора по умолчанию (сопоставление происходит максимально возможное количество раз).
Также символ используется в квантификаторах предпросмотра (?=) , (?!) и (?:) , также описанных в этой таблице.
Сопоставляется с x , только если за x не следует y . Например, шаблон /\d+(?!\.)/ сопоставляется с числом только если за ним не следует десятичная запятая.
Выражение /\d+(?!\.)/.exec('3.141') сопоставится с «141» но не с «3.141».
Сопоставляется с x , только если x предшествует y
Сопоставляется с x , только если x не предшествует y
Сопоставляется либо с x , либо с y .
Например, шаблон /зелёное|красное/ сопоставится с подстрокой «зелёное» в строке «зелёное яблоко» и подстрокой «красное» в строке «красное яблоко».
Где n является целым положительным числом. Сопоставляется точно с n вхождениями предшествующего элемента x.
Например, шаблон /о/ не сопоставится с символом «о» в слове «конфета», но сопоставится со всеми символами «о» в слове «коонфета» и с первыми двумя символами «о» в слове «кооонфета».
Где n является целым положительным числом. Сопоставляется по крайней мере с n вхождениями предшествующего элемента x.
Например, шаблон /о/ не сопоставится с символом «о» в слове «конфета», но сопоставится со всеми символами «о» в словах «коонфета» и даже в «кооооооонфета».
Где n и m являются целыми положительными числами. Сопоставляется по крайней мере с n но не более, чем с m вхождениями предшествующего элемента x.
Например, шаблон /о/ ни с чем не сопоставится в слове «кнфета», с символом «о» в слове «конфета», с двумя символами «о» в слове «коонфета» и с первыми тремя символами «о» в слове «кооооооонфета». Обратите внимание, что при сопоставлении со словом «кооооооонфета» сопоставимость только подстрока «ооо», хотя слово содержало гораздо больше символов «о».
Свойства
RegExp.prototype (en-US) Позволяет добавлять свойства ко всем объектам регулярных выражений. RegExp.length Значение RegExp.length равно 2.
Методы
Глобальный объект RegExp не имеет собственных методов, однако, он наследует некоторые методы через цепочку прототипов.
Регулярные выражения (regular expressions) - это текстовый шаблон, который соответствует какому-то тексту. И всё? Да, это всё, для чего они нужны.
Что можно делать с помощью регулярных выражений:
- Проверять то, что вводит пользователь, чтобы быть уверенным в правильности данных (например, правильно ли пользователь ввёл email или ip-адрес).
- Разбирать большой текст на меленькие кусочки (например, выбирать данные из большого лога).
- Делать замены по шаблону (например, убирать непечатаемые символы из XML).
- Показывать невероятную крутость тем, кто не знает регулярных выражений.
Большинство современных языков программирования и текстовых редакторов (по моему личному мнению) поддерживают регулярные выражения. Поддержим их и мы.
/Быть или не быть/ugi ¶
Синтаксис регулярных выражений прост и логичен. Он разделяется на символ-разделитель (он идёт в начале и конце выражения, обычно это /), шаблон поиска и необязательные модификаторы.
Формальный синтаксис такой:
Разделителем может быть любой символ, но обычно это / или ~ . Важно лишь то, чтобы шаблон начинался и заканчивался одним и тем же разделителем. В самом конце регулярных выражений идут модификаторы, которые нужны, чтобы менять логику работы шаблонов (например делать регистронезависимый поиск).
Давайте разберём выражение /Быть или не быть/ugi :
Данное регулярное выражение будет искать текст Быть или не быть не зависимо от регистра по всему тексту неограниченное количество раз. Модификатор u нужен для того, чтобы явно указать, что текст у нас в юникоде, то есть содержит символы, отличные от латиницы. Модификатор i включает регистронезависимый поиск. Модификатор g указывает поисковику идти до победного конца, иначе он остановится после первого удачного совпадения.
"Петя любит Дашу".replace(/Дашу|Машу|Сашу/, "Катю") ¶
Не трудно догадаться, что результатом работы js-выражения выше будет текст "Петя любит Катю" . Даже, если Петя неровно дышит к Маше или Саше, то результат всё равно не изменится.
Рассмотрим базовые спец. символы, которые можно использовать в шаблонах:
Символ Описание Пример использования Результат \ Символ экранирования или начала мета-символа /путь\/к\/папке/ Надёт текст путь/к/папке ^ Признак начала строки /^Дом/ Найдёт все строки, которые начинаются на Дом $ Признак конца строки /родной$/ Найдёт все строки, которые заканчиваются на родной . Точка означает любой символ, кроме перевода строки /Петя ..бит Машу/ Найдёт как Петя любит Машу , так и Петя губит Машу | Означает ИЛИ /Вася|Петя/ Найдёт как Васю, так и Петю ? Означает НОЛЬ или ОДИН раз /Вжу?х/ Найдёт Вжх и Вжух * Означает НОЛЬ или МНОГО раз /Вжу*х/ Найдёт Вжх , Вжух , Вжуух , Вжууух и т.д. + Означает ОДИН или МНОГО раз /Вжу+х/ Найдёт Вжух , Вжуух , Вжууух и т.д. Помимо базовых спец. символов есть мета-символы (или мета-последовательности), которые заменяют группы символов:
Символ Описание Пример использования Результат \w Буква, цифра или _ (подчёркивание) /^\w+$/ Соответствует целому слову без пробелов, например _Вася333_ \W НЕ буква, цифра или _ (подчёркивание) /\W\w+\W/ Найдёт полное слово, которое обрамлено любыми символами, например @Петя@ \d Любая цифра /^\d+$/ Соответствует целому числу без знака, например 123 \D Любой символ НЕ цифра /^\D+$/ Соответствует любому выражению, где нет цифр, например Петя \s Пробел или табуляция (кроме перевода строки) /\s+/ Найдёт последовательность пробелов от одного и до бесконечности \S Любой символ, кроме пробела или табуляции /\s+\S/ Найдёт последовательность пробелов, после которой есть хотя бы один другой символ \b Граница слова /\bдом\b/ Найдёт только отдельные слова дом , но проигнорирует рядом \B НЕ граница слова /\Bдом\b/ Найдёт только окночние слов, которые заканчиваются на дом \R Любой перевод строки (Unix, Mac, Windows) /.*\R/ Найдёт строки, которые заканчиваются переводом строки Нужно отметить, что спец. символы \w, \W, \b и \B не работают по умолчанию с юникодом (включая кириллицу). Для их правильной работы нужно указывать модификатор u . К сожалению, на окончание 2019 года JavaScript не поддерживает регулярные выражения для юникода даже с модификатором, поэтому в js эти мета-символы работают только для латиницы.
Ещё регулярные выражения поддерживают разные виды скобочек:
Выражение Описание Пример использования Результат (. ) Круглые скобки означают под-шаблон, который идёт в результат поиска /(Петя|Вася|Саша) любит Машу/ Найдёт всю строку и запишет воздыхателя Маши в результат поиска под номером 1 (. ) Круглые скобки с вопросом и двоеточием означают под-шаблон, который НЕ идёт в результат поиска /(?:Петя|Вася|Саша) любит Машу/ Найдёт только полную строку, воздыхатель останется инкогнито (?P. ) Задаёт имя под-шаблона /(?PПетя|Вася|Саша) любит Машу/ Найдёт полную строку, а воздыхателя запишет в результат под индексом 1 и 'воздыхатель' [abc] Квадратные скобки задают ЛЮБОЙ СИМВОЛ из последовательности (включая спец. символы \w, \d, \s и т.д.) /^[123]+$/ Соответствует любому выражению 323323123 , но не 54321 [a-я0-9] Если внутри квадратных скобок указать минус, то это считается диапазоном /[A-Za-zА-Яа-яЁё0-9_]+/ Аналог /\w/ui для JavaScript [abc-] Если минус является первым или последним символом диапазона, то это просто минус /[0-9+-]+/ Найдёт любое целое числое с плюсом или минусом (причём не обязательно, чтобы минус или плюс были спереди) [^. ] Квадратные скобки с "крышечекой" означают любой символ НЕ входящий в диапазон /[^a-zа-я0-9 ]/i Найдёт любой символ, который не является буквой, числом или пробелом [[:class:]] Квадратные скобки в квадратных скобках задают класс символов (alnum, alpha, ascii, digit, print, space, punct и другие) /[^[:print:]]+/ Найдёт последовательность непечатаемых символов Фигурные скобки с одним числом задают точное количество символов /\w+н\w+/u Найдёт слово, в котором две буквы н Фигурные скобки с двумя числами задают количество символов от n до k /\w+н\w+/u Найдёт слово, в котором есть одна или две буквы н Фигурные скобки с одним числом и запятой задают количество символов от n до бесконечности /\w+н\w+/u Найдёт слово, в котором н встречается от трёх и более раз подряд Как правильно писать регулярные выражения ¶
Для примера возьмём валидацию ip-адреса. Первая мысль должна быть: "Я хочу валидировать ip-адрес. А что такое ip-адрес? Из чего он состоит?". Затем нужен список валидных и невалидных адресов:
Валидный адрес должен содержать четыре числа (байта) от 0 до 255. Если он содержит число больше 255, это уже ошибка. Если бы мы делали валидацию на каком-либо языке программирования, то можно было бы разбить выражение на четыре части и проверить каждое число отдельно. Но регулярные выражения не поддерживают проверки больше или меньше, поэтому придётся делать по-другому.
Для начала упростим задачу: будем валидировать не весь ip-адрес, а только один байт. А байт это всегда есть либо одно-, либо дву-, либо трёхзначное число. Для одно- и двузначного числа шаблон очень простой - любая цифра. А вот для трёхзначного числа первая цифра либо единица, либо двойка. Если первая цифра единица, то вторая и третья могут быть от нуля до девяти. Если же первая цифра двойка, то вторая может быть только от нуля до пяти. Если первая цифра двойка и вторая пятёрка, то третья может быть только от ноля до пяти. Давайте формализуем:
Теперь, зная все диапазоны байта, можно объединить их в одно выражение через вертикальную палочку | (ИЛИ):
Обратите внимание, что я использовал границу слова \b, чтобы искать полные байты. Пробуем регулярку в деле:
Как видим, все байты стали зелёненькими. Это значит, что мы на верном пути.
Осталось дело за малым: сделать так, чтобы искать четыре байта, а не один. Нужно учесть, что байты разделены тремя точками. То есть мы ищем три байта с точкой на конце и один без точки:
Результат выглядит так:
Подсветились только валидные ip-адреса, значит регулярное выражение работает корректно.
Если бы я сразу начал писать валидацию всего адреса, а не отдельного байта, то с большой долей вероятности допустил бы ошибку. Скопления скобочек, палочек и точечек трудно воспринимаются на глаз, поэтому задачу надо обязательно упрощать.
Практическое применение регулярных выражений ¶
Регулярными выражениями можно пользоваться не только для валидации, но и для обработки данных, например, в блокноте. Вот практический пример такой обработки: скопировать номера регионов и перевести в формат PHP-массива.
- Объект RegExp
- Спецсимволы в регулярном выражении
- Проверка результатов: метод test
- Поиск совпадений: метод exec
- Строковые методы, поиск и замена
- Метод search(regexp)
- Метод match(regexp)
- Замена, replace
- Спецсимволы в строке замены
- Замена через функцию
Регулярные выражения в javascript имеют особую краткую форму и стандартный PCRE-синтаксис.
Работают они через специальный объект RegExp.
Кроме того, у строк есть свои методы search,match,replace, но чтобы их понять - разберем-таки сначала RegExp .
Объект RegExp
Объект типа RegExp , или, короче, регулярное выражение, можно создать двумя путями
pattern - регулярное выражение для поиска (о замене - позже), а флаги - строка из любой комбинации символов g (глобальный поиск), i (регистр неважен) и m (многострочный поиск).
Первый способ используется часто, второй - иногда. Например, два таких вызова эквивалентны:
При втором вызове - т.к регулярное выражение в кавычках, то нужно дублировать \
При поиске можно использовать большинство возможностей современного PCRE-синтаксиса.
Спецсимволы в регулярном выражении
Символ Значение \ Для обычных символов - делает их специальными. Например, выражение /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 или более раз. Эквивалентно . Например, /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 повторений предшествующего элемента. Например, /a/ не найдет 'a' в "candy," но найдет оба a в "caandy," и первые два a в "caaandy." Где n - положительное целое число. Находит n и более повторений элемента. Например, /a не найдет 'a' в "candy", но найдет все 'a' в "caandy" и в "caaaaaaandy." Где 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." \c X Где X - буква от A до Z. Обозначает контрольный символ в строке. Например, /\cM/ обозначает символ Ctrl-M. \d находит цифру из любого алфавита (у нас же юникод). Испльзуйте 4, чтобы найти только обычные цифры. Например, /\d/ или /3/ найдет '2' в "B2 is the suite number." \D Найдет нецифровой символ (все алфавиты). [^0-9] - эквивалент для обычных цифр. Например, /\D/ или /[^0-9]/ найдет 'B' в "B2 is the suite number." \f,\r,\n Соответствующие спецсимволы form-feed, line-feed, перевод строки. \s Найдет любой пробельный символ, включая пробел, табуляцию, переводы строки и другие юникодные пробельные символы. Например, /\s\w*/ найдет ' bar' в "foo bar." \S Найдет любой символ, кроме пробельного. Например, /\S\w*/ найдет 'foo' в "foo bar." \t Символ табуляции. \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%." \ n где n - целое число. Обратная ссылка на n-ю запомненную скобками подстроку. Например, /apple(,)\sorange\1/ найдет 'apple, orange,' в "apple, orange, cherry, peach.". За таблицей есть более полный пример. \0 Найдет символ NUL. Не добавляйте в конец другие цифры. \x hh Найдет символ с кодом hh (2 шестнадцатиричных цифры) \u hhhh Найдет символ с кодом hhhh (4 шестнадцатиричных цифры). Проверка результатов: метод test
Чтобы просто проверить, подходит ли строка под регулярное выражение, используется метод test :
Метод test начинает поиск, начиная со свойства lastIndex объекта RegExp , если оно установлено.
Поиск совпадений: метод exec
Метод exec возвращает массив и ставит свойства регулярного выражения.
Если совпадений нет, то возвращается null.В результате выполнения скрипта будут такие результаты:
Объект Свойство/Индекс Описания Пример myArray Содержимое myArray . ["dbBd", "bB", "d"] index Индекс совпадения (от 0) 1 input Исходная строка. cdbBdbsbz [0] Последние совпавшие символы dbBd [1], . [ n ] Совпадения во вложенных скобках, если есть. Число вложенных скобок не ограничено. [1] = bB
[2] = dmyRe lastIndex Индекс, с которого начинать следующий поиск. 5 ignoreCase Показывает, что был включен регистронезависимый поиск, флаг " i ". true global Показывает, что был включен флаг " g " поиска всех совпадений. true multiline Показывает, был ли включен флаг многострочного поиска " m ". false source Текст паттерна. d(b+)(d) Если в регулярном выражении включен флаг " g ", Вы можете вызывать метод exec много раз для поиска последовательных совпадений в той же строке. Когда Вы это делаете, поиск начинается на подстроке str , с индекса lastIndex . Например, вот такой скрипт:
Этот скрипт выведет следующий текст:
В следующем примере функция выполняет поиск по input. Затем делается цикл по массиву, чтобы посмотреть, есть ли другие имена.
Строковые методы, поиск и замена
Следующие методы работают с регулярными выражениями из строк.
Все методы, кроме replace, можно вызывать как с объектами типа regexp в аргументах, так и со строками, которые автоматом преобразуются в объекты RegExp.
Так что вызовы эквивалентны:
При использовании кавычек нужно дублировать \ и нет возможности указать флаги. Если регулярное выражение уже задано строкой, то бывает удобна и полная форма
Метод search(regexp)
Возвращает индекс регулярного выражения в строке, или -1.
Если Вы хотите знать, подходит ли строка под регулярное выражение, используйте метод search (аналогично RegExp-методы test ). Чтобы получить больше информации, используйте более медленный метод match (аналогичный методу RegExp exec ).
Метод match(regexp)
Если в regexp нет флага g , то возвращает тот же результат, что regexp.exec(string) .
Если в regexp есть флаг g , то возвращает массив со всеми совпадениями.
Чтобы просто узнать, подходит ли строка под регулярное выражение regexp , используйте regexp.test(string) .
Если Вы хотите получить первый результат - попробуйте r egexp.exec(string) .
В следующем примере match используется, чтобы найти "Chapter", за которой следует 1 или более цифр, а затем цифры, разделенные точкой. В регулярном выражении есть флаг i , так что регистр будет игнорироваться.
Скрипт выдаст массив из совпадений:
- Chapter 3.4.5.1 - полностью совпавшая строка
- 3.4.5.1 - первая скобка
- .1 - внутренняя скобка
Следующий пример демонстрирует использование флагов глобального и регистронезависимого поиска с match . Будут найдены все буквы от А до Е и от а до е, каждая - в отдельном элементе массива.
Замена, replace
Метод replace может заменять вхождения регулярного выражения не только на строку, но и на результат выполнения функции. Его полный синтаксис - такой:
regexp Объект RegExp. Его вхождения будут заменены на значение, которое вернет параметр номер 2 substr Строка, которая будет заменена на newSubStr . newSubStr Строка, которая заменяет подстроку из аргумента номер 1. function Функция, которая может быть вызвана для генерации новой подстроки (чтобы подставить ее вместо подстроки, полученной из аргумента 1).
Метод replace не меняет строку, на которой вызван, а просто возвращает новую, измененную строку.
Чтобы осуществить глобальную замену, включите в регулярное выражение флаг "g" .
Если первый аргумент - строка, то она не преобразуется в регулярное выражение, так что, например,
Вызов replace оставил строку без изменения, т.к искал не регулярное выражение \s , а строку "\s".
Спецсимволы в строке замены
В строке замены могут быть такие спецсимволы:
Pattern Inserts $$ Вставляет "$". $& Вставляет найденную подстроку. $` Вставляет часть строки, которая предшествует найденному вхождению. $' Вставляет часть строки, которая идет после найденного вхождения. $ n or $ nn Где n или nn - десятичные цифры, вставляет подстроку вхождения, запомненную n -й вложенной скобкой, если первый аргумент - объект RegExp. Замена через функцию
Если Вы указываете вторым параметром функцию, то она выполняется при каждом совпадении.
В функции можно динамически генерировать и возвращать строку подстановки.
Первый параметр функции - найденная подстрока. Если первым аргументом replace является объект RegExp , то следующие n параметров содержат совпадения из вложенных скобок. Последние два параметра - позиция в строке, на которой произошло совпадение и сама строка.
Например, следующий вызов replace возвратит XXzzzz - XX , zzzz.
Как видите, тут две скобки в регулярном выражении, и потому в функции два параметра p1 , p2 .
Если бы были три скобки, то в функцию пришлось бы добавить параметр p3 .Следующая функция заменяет слова типа borderTop на border-top :
Статичные регэкспы
В некоторых реализациях javascript регэкспы, заданные коротким синтаксисом /. / - статичны. То есть, такой объект создается один раз в некоторых реализациях JS, например в Firefox. В Chrome все ок.
По стандарту эта возможность разрешена ES3, но запрещена ES5.
Из-за того, что lastIndex при глобальном поиске меняется, а сам объект регэкспа статичен, первый поиск увеличивает lastIndex , а последующие - продолжают искать со старого lastIndex , т.е. могут возвращать не все результаты.
При поиске всех совпадений в цикле проблем не возникает, т.к. последняя итерация (неудачная) обнуляет lastIndex .
Дополнительно
Для общего понимания регулярных выражений можно почитать Статью в wikipedia.
Более подробно они описаны в книге (англ.) Beginning Regular Expressions.
Читайте также: