1. Главная страница » Компьютеры

Javascript регулярные выражения примеры

Автор: | 16.12.2019

Содержание

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

Регулярные выражения (RegExp) — это очень эффективный способ работы со строками.

Составив регулярное выражение с помощью специального синтаксиса вы можете:

  • искать текст в строке
  • заменять подстроки в строке
  • извлекать информацию из строки

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

Регулярные выражения относятся к 1950-м годам, когда они были формализованы как концептуальный шаблон поиска для алгоритмов обработки строк.

Регулярные выражения реализованные в UNIX, таких как grep, sed и популярных текстовых редакторах, начали набирать популярность и были добавлены в язык программирования Perl, а позже и в множество других языков.

Читайте также:  Boot menu sony vaio как зайти

JavaScript, наряду с Perl, это один из языков программирования в котором поддержка регулярных выражений встроена непосредственно в язык.

Сложно, по полезно

Новичкам регулярные выражения могут показаться абсолютной ерундой, а зачастую даже и профессиональным разработчикам, если не вкладывать время необходимое для их понимания.

Регулярные выражения сложно писать, сложно читать и сложно поддерживать/изменять.

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

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

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

Как выглядят регулярные выражения

В JavaScript регулярные выражения это объект, который может быть определён двумя способами.

Первый способ заключается в создании нового объекта RegExp с помощью конструктора:

Второй способ заключается в использовании литералов регулярных выражений:

Вы знаете что в JavaScript есть литералы объектов и литералы массивов? В нём также есть литералы regexp.

В приведённом выше примере hey называется шаблоном. В литеральной форме он находится между двумя слэшами, а в случае с конструктором объекта, нет.

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

Как они работают?

Регулярное выражение, которое мы определили выше как re1 , очень простое. Оно ищет строку hey без каки-либо ограничений: строка может содержать много текста, а слово hey находиться где-то в середине и регулярное выражение сработает. Строка может содержать только слово hey и регулярка опять сработает.

Это довольно просто.

Вы можете попробовать протестировать регулярное выражение с помощью метода RegExp.test(String) , который возвращает логическое ( boolean ) значение:

В примере выше мы просто проверили удовлетворяет ли "hey" шаблону регулярного выражения, который храниться в re1 .

Это проще простого, но вы уже знаете много о регулярных выражениях.

Закрепление

сработает независимо от того где находится hey внутри строки.

Если вы хотите найти строки, которые начинаются с hey , то используйте оператор ^ :

Если вы хотите найти строки, которые заканчиваются на hey , то используйте оператор $ :

Объединяя два предыдущих оператора вы можете найти строку, которая полностью совпадает с hey :

Чтобы найти строку начинающуюся с одной подстроки, а заканчивающуюся другой подстрокой вы можете использовать .* , который будет совпадать с любым символом повторяющимся 0 или более раз:

Поиск элементов по диапазону

Вместо того чтобы искать определённую строку, вы можете указать диапазон символов, например:

Эти регулярные выражения ищут строки, которые содержат хотя бы один символ из выбранного диапазона:

Диапазоны можно комбинировать:

Поиск многократных совпадений элемента диапазона

Вы можете проверить содержит ли строка только один символ из диапазона с помощью символа — :

Инверсия шаблона

Символ ^ в начале шаблона привязывает его к началу строки.

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

Метасимволы

  • d совпадает с любым числом, эквивалентно [0-9]
  • D совпадает с любым символом, который не является числом, эквивалентно [^0-9]
  • w совпадает с любым буквенно-числовым символом, эквивалентно [A-Za-z0-9]
  • W совпадает с любым символом, который не является буквенно-числовым значением, эквивалентно [^A-Za-z0-9]
  • s совпадает с любым пробельным символом: пробел, табуляция, символ новой строки и пробелы Unicode
  • S совпадает с любым символом, который не является пробелом
  • совпадает с null
  • совпадает с символом новой строки
  • совпадает с символом табуляции
  • uXXXX совпадает с символом Unicode с кодом XXXX (требуется флаг u )
  • . совпадает с любым символовом, кроме символа новой строки (таким как
    ) (если вы не используете флаг s , объясним позже)
  • [^] совпадает с любым символом, включая символ новой строки. Полезно при работе с многострочными строками

Выбор в регулярных выражениях

Если вы хотите выбрать одну или другую строку, используйте оператор | .

Квантификаторы

Представьте что у вас есть регулярное выражение, которое проверяет строку на то чтобы она состояла только из одной цифры:

Вы можете использовать квантификатор ? , который сделает этот символ необязательным. В нашем случае цифра должна встречаться 0 или 1 раз:

но что если мы хотим чтобы регулярное выражение срабатывало на несколько цифр?

Вы можете сделать это 4 способами, используя + , * , и .

Совпадает с одним или более (>=1) элементами:

Совпадает с 0 или более (>=0) элементами:

Совпадает точно с n количеством элементов:

Совпадает с диапазоном от n до m элементов:

m можно опустить и оставить второй предел без ограничений, чтобы было минимум n элементов:

Опциональные элементы

Следующий за элементом знак ? , сделает его необязательным:

Группы

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

Пример ниже ищет точное совпадение из 3 цифр за которым следует один или более буквенно-числовые символов:

Повторяющиеся символы, которые находятся после закрывающей группу скобки, относятся ко всей группе:

Захват групп

До сих пор мы видели, как тестировать строки и проверять, содержат ли они определенный шаблон.

Крутая возможность регулярных выражений заключается в том, что можно захватывать определённые части строки и складывать их в массив.

Вы можете делать это с помощью групп, а точнее с помощью захвата групп.

По умолчанию, группы итак захватываются. Теперь вместо использования RegExp.test(String) , который просто возвращает логическое значение, мы будем использовать один из следующих методов:

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

Если совпадений не найдено, то он возвращает null .

Когда группа совпадает несколько раз, то только последнее найденное значение будет добавлено в возвращаемый массив.

Опциональные группы

Захват групп можно сделать опциональным с помощью (. )? . Если ничего не будет найдено, то в возвращаемый массив будет добавлен элемент undefined :

Ссылка на найденную группу

Каждой найденной группе присваивается число. $1 ссылается на первый элемент, $2 на второй, и так далее. Это полезно, когда мы будет говорить о замене части строки.

Именованный захват групп

Это новая возможность ES2018.

Группе можно назначить имя, а не просто слот в возвращаемом массиве:

Использование match и exec без групп

Существует разница при использовании match и exec без групп: в первом элементе массива будет находится не полностью найденная строка, а прямое совпадение:

Незахватываемые группы

Так как по умолчанию группы являются захватываемыми, нам нужен способ игнорировать некоторые группы в возвращаемом массиве. Это возможно с помощью незахватываемых групп, которые начинаются с (. ) .

Флаги

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

  • g : ищет совпадения глобально
  • i : делает регулярное выражение не чувствительным к регистру
  • m : включает многострочный режим. В этом режиме ^ и $ совпадают с началом и концом всей строки. Без этого флага, с многострочными строками они совпадают с началом и концом каждой строки.
  • u : включает поддержку Unicode (добавлено в ES6/ES2015)
  • s : (новое в ES2018) сокращение от "single line", он позволяет . совпадать с символами новой строки

Флаги можно комбинировать, а также они добавляются в конец строки литерала:

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

Инспектирование регулярных выражений

Вы можете инспектировать свойства регулярных выражений:

  • source — строка шаблона
  • multiline — принимается значение true если установлен флаг m
  • global — принимается значение true если установлен флаг g
  • ignoreCase — принимается значение true если установлен флаг i
  • lastIndex

Экранирование

Это специальные символы потому что они являются управляющими символами при составлении шаблонов регулярных выражений, поэтому если вы хотите использовать их для поиска совпадений внутри шаблона, то вам нужно экранировать их с помощью символа обратного слэша:

Границы строк

 и B позволяют определить находится ли строка в начале или конце слова:

  •  совпадает если набор символов находится в начале или конце слова
  • B совпадает если набор символов не находится в начале или конце слова

Замена с помощью регулярных выражений

Мы уже видели как нужно проверять строки на совпадение с шаблоном.

Также мы видели как можно извлекать часть строк соотвествующие шаблону в массив.

Теперь давайте рассмотрим как заменять части строки на основе шаблона.

У объекта String в JavaScript есть метод replace() , который можно использовать без регулярных выражений для одной замены в строке:

Этот метод также может принимать и регулярное выражение в качестве аргумента:

Использование флага g — это единственный способ заменить несколько вхождений в строке на ванильном JavaScript:

Группы позволяют нам делать больше причудливых вещей, менять местами части строк:

Вместо строки можно использовать функцию, чтобы делать ещё более интересные вещи. В неё будет передан ряд аргументов, таких как возвращают методы String.match(RegExp) или RegExp.exec(String) , где количество аргументов зависит от количества групп:

Жадность

Регулярные выражения называются жадными по умолчанию.

Возьмём например это регулярное выражение:

Предполагается, что нам нужно извлечь из строки сумму в долларах:

но что если у нас есть больше слов после числа, это отвлекает

Почему? Потому что регулярное выражение после знака $ совпадает с любым символом .+ и не останавливается пока не достигнет конца строки. Затем он останавливается, потому что s? делает конечное пространство необязательным.

Чтобы исправить это, нам нужно указать что регулярное выражение должно быть ленивым и найти наименьшее количество совпадений. Мы можем сделать это с помощью символа ? после квантификатора:

Итак, символ ? может означать разные вещи в зависимости от своего положения, поэтому он может быть и квантификатором и индикатором ленивого режима.

Опережение: соответствие строки в зависимости от того что за ней следует

Используйет ?= для поиска совпадений в строке за которой следует определённая подстрока

?! выполняет обратную операцию и находит совпадений в строке за которыми не следует определённая подстрока:

Ретроспектива: соответствие строки в зависимости от того что ей предшествует

Это новая возможность ES2018.

Опережение использует символ ?= . Ретроспектива использует ? :

Инверсия ретроспективы использует ? :

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

Флаг u является обязательным при работе с Unicode строками, в частности когда может понадобится обрабатывать строки в астральных плоскостях, которые не включены в первые 1600 символов Unicode.

Например эмодзи, но и только они.

Если вы не добавили этот флаг, то это просто регулярное выражение, которые должно найти совпадение одного символа, не будет работать, потому что для JavaScript этот эмодзи внутри представлен двумя символами:

Поэтому, всегда используйте флаг u .

Unicode, как и обычные символы, может обрабатывать диапазоны:

JavaScript проверяет внутренние коды представления, поэтому ? u1F436 u1F43A u1F98A . Посмотрите полный список эмодзи чтобы увидеть коды и узнать их порядок.

Экранирование свойств Unicode

Как мы говорили выше, в шаблоне регулярного выражения вы можете использовать d чтобы найти совпадение на любую цифру, s чтобы найти совпадение на любой символ кроме пробела, w чтобы найти совпадение на любой буквенно-числовой символ и т. д.

Экранирование свойств Unicode — это возможность ES2018, которая добавляет очень крутую функцию, расширяя эту концепцию на всех Unicode символы и добавляя p<> и P<> .

У любого Unicode символа есть набор свойств. Например Script определяет семейство языков, ASCII — это логическое значение равное true для ASCII символов и т.д. Вы можете положить это свойство в фигурные скобки и регулярное выражение будет проверять чтобы его значение было истинным:

ASCII_Hex_Digit — это ещё одно логическое свойство, которое проверяет содержит ли строка тольк валидные шестнадцатеричные цифры:

Существует много других логических свойств, которые вы можете проверить просто добавив их имя в фигурные скобки, включая Uppercase , Lowercase , White_Space , Alphabetic , Emoji и другие:

В дополнении к этим бинарным свойствам, вы можете проверить любое свойство символа Unicode чтобы соответствовало конкретному значению. В примере ниже я проверяю, записана ли строка в греческом или латинском алфавите:

Прочитать больше обо всех свойствах вы можете здесь.

Извлечение числа из строки

Предположим, что есть строка содержащая только одно число, которое нужно извлечь. /d+/ должен сделать это:

Поиск E-mail адреса:

Простейший подход заключается в проверке безпробельных символов до и после знака @ , с помощью S :

Однако, это упрощенный пример, так как под него попадает множество не валидных E-mail адресов.

Захват текста между двойными кавычками

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

Лучший способ сделать это — использовать захват групп, потому то мы знаем что наше совпадение должно начинаться и заканчиваться символом " , поэтому мы можем легко настроить шаблон, но также мы хотим удалить эти кавычки из результата.

Мы найдём то что нам нужно в result[1] :

Получение содержимого из HTML тега

Например получить содержимое из тега span , допуская при этом любое количество аргументов у тега:

Поиск по форуму
Расширенный поиск
К странице.

Регулярные выражения в 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 или более раз. Эквивалентно <1,>. Например, /a+/ найдет ‘a’ в "candy" и все ‘a’ в "caaaaaaandy".
? Обозначает, что элемент может как присутствовать, так и отсутствовать. Например, /e?le?/ найдет ‘el’ в "angel" и ‘le’ в "angle."Если используется сразу после одного из квантификаторов * , + , ? , или <> , то задает "нежадный" поиск (повторение минимально возможное количество раз, до ближайшего следующего элемента паттерна), в противоположность "жадному" режиму по умолчанию, при котором количество повторений максимально, даже если следующий элемент паттерна тоже подходит.Кроме того, ? используется в предпросмотре, который описан в таблице под (?=) , (?!) , и (?: ) .
. (Десятичная точка) обозначает любой символ, кроме перевода строки:

u2028 or u2029. ( можно использовать [sS] для поиска любого символа, включая переводы строк). Например, /.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<2>/ не найдет ‘a’ в "candy," но найдет оба a в "caandy," и первые два a в "caaandy."
Где n — положительное целое число. Находит n и более повторений элемента. Например, /a <2,>не найдет ‘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."
[] Находит символ backspace. (Не путать с  .)
 Находит границу слов (латинских), например пробел. (Не путать с [] ). Например, /nw/ найдет ‘no’ в "noonday"; /wy/ найдет ‘ly’ в "possibly yesterday."
B Обозначает не границу слов. Например, /wBn/ найдет ‘on’ в "noonday", а /yBw/ найдет ‘ye’ в "possibly yesterday."
c X Где 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."
f,
,
Соответствующие спецсимволы form-feed, line-feed, перевод строки.
s Найдет любой пробельный символ, включая пробел, табуляцию, переводы строки и другие юникодные пробельные символы. Например, /sw*/ найдет ‘ bar’ в "foo bar."
S Найдет любой символ, кроме пробельного. Например, /Sw*/ найдет ‘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%."
n где n — целое число. Обратная ссылка на n-ю запомненную скобками подстроку. Например, /apple(,)sorange1/ найдет ‘apple, orange,’ в "apple, orange, cherry, peach.". За таблицей есть более полный пример.
Найдет символ 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] = d
myRe 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.

Описание

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

pattern — регулярное выражение для поиска (о замене — позже), а флаги — строка из любой комбинации символов g(глобальный поиск), i(регистр неважен) и m(многострочный поиск). Первый способ используется часто, второй — иногда. Например, два таких вызова эквивалентны.

Опции поиска

При создании регулярного выражения мы можем указать дополнительных опции поиска

i ignore case Не различать строчные и прописные буквы.
g global search Глобальный поиск всех вхождений образца.
m multiline Многострочный ввод должен рассматриваться как несколько строк. Если используется флаг m , то ^ и $ совпадают в начале и в конце любой строки общей строки ввода, вместо начала и конца всей строки ввода.

Символы в регулярных выражениях JavaScript

Символ Соответствие
Алфавитно-цифровые символы Соответствуют сами себе
Символ NUL (u0000)
Табуляция (u0009)
Перевод строки (u000A)
v Вертикальная табуляция (u000B)
f Перевод страницы (u000C)
Возврат каретки (u000D)
xnn Символ из набора Latin, задаваемый шестнадцатеричным числом nn; например, x0A — это то же самое, что
uxxxx Unicode-символ, заданный шестнадцатеричным числом xxxx; например, u0009 — это то же самое, что
cX Управляющий символ "X", например, последовательность cJ эквивалентна символу перевода строки
Для обычных символов — делает их специальными. Например, выражение /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."Если используется сразу после одного из квантификаторов * , + , ? , или <> , то задает "нежадный" поиск (повторение минимально возможное количество раз, до ближайшего следующего элемента паттерна), в противоположность "жадному" режиму по умолчанию, при котором количество повторений максимально, даже если следующий элемент паттерна тоже подходит.Кроме того, ? используется в предпросмотре, который описан в таблице под (?=) , (?!) , и (?: ) .
. (Десятичная точка) обозначает любой символ, кроме перевода строки:

u2028 or u2029. ( можно использовать [sS] для поиска любого символа, включая переводы строк). Например, /.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<2>/ не найдет ‘a’ в "candy," но найдет оба a в "caandy," и первые два a в "caaandy."
Где n — положительное целое число. Находит n и более повторений элемента. Например, /a <2,>не найдет ‘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."
[] Находит символ backspace. (Не путать с  .)
 Находит границу слов (латинских), например пробел. (Не путать с [] ). Например, /nw/ найдет ‘no’ в "noonday"; /wy/ найдет ‘ly’ в "possibly yesterday."
B Обозначает не границу слов. Например, /wBn/ найдет ‘on’ в "noonday", а /yBw/ найдет ‘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 Найдет любой пробельный символ, включая пробел, табуляцию, переводы строки и другие юникодные пробельные символы. Например, /sw*/ найдет ‘ bar’ в "foo bar."
S Найдет любой символ, кроме пробельного. Например, /Sw*/ найдет ‘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 — шаблон замены, может принитать значения строки, шаблона замены, функции (имя функции).

Спецсимволы в строке замены

$$ Вставляет "$".
$& Вставляет найденную подстроку.
$` Вставляет часть строки, которая предшествует найденному вхождению.
$’ Вставляет часть строки, которая идет после найденного вхождения.
$ n or $ nn Где n или nn — десятичные цифры, вставляет подстроку вхождения, запомненную n -й вложенной скобкой, если первый аргумент — объект RegExp.

Замена через функцию

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *