Конструктор объекта regexp может принимать на вход либо один либо два аргумента

Обновлено: 03.05.2024

The RegExp constructor creates a regular expression object for matching text with a pattern.

For an introduction to regular expressions, read the Regular Expressions chapter in the JavaScript Guide.

Try it

Syntax

Literal, constructor, and factory notations are possible:

Parameters

The text of the regular expression.

As of ES5, this can also be another RegExp object or literal (for the two RegExp constructor notations only). Patterns may include special characters to match a wider range of values than would a literal string.

If specified, flags is a string that contains the flags to add.

Alternatively, if an object is supplied for the pattern, the flags string will replace any of that object's flags (and lastIndex will be reset to 0 ) (as of ES2015).

If flags is not specified and a regular expressions object is supplied, that object's flags (and lastIndex value) will be copied over.

flags may contain any combination of the following characters:

Generate indices for substring matches.

Find all matches rather than stopping after the first match.

If u flag is also enabled, use Unicode case folding.

Treat beginning and end characters ( ^ and $ ) as working over multiple lines. In other words, match the beginning or end of each line (delimited by \n or \r ), not only the very beginning or end of the whole input string.

Allows . to match newlines.

Treat pattern as a sequence of Unicode code points..

Matches only from the index indicated by the lastIndex property of this regular expression in the target string. Does not attempt to match from any later indexes.

Exceptions

  • If pattern cannot be parsed as a valid regular expression, a SyntaxError is thrown.
  • If flags contains repeated characters or any character outside of those allowed, a SyntaxError is thrown.

Examples

Literal notation and constructor

There are two ways to create a RegExp object: a literal notation and a constructor.

  • The literal notation's parameters are enclosed between slashes and do not use quotation marks.
  • The constructor function's parameters are not enclosed between slashes but do use quotation marks.

The following three expressions create the same regular expression:

The literal notation results in compilation of the regular expression when the expression is evaluated. Use literal notation when the regular expression will remain constant. For example, if you use literal notation to construct a regular expression used in a loop, the regular expression won't be recompiled on each iteration.

The constructor of the regular expression object—for example, new RegExp('ab+c') —results in runtime compilation of the regular expression. Use the constructor function when you know the regular expression pattern will be changing, or you don't know the pattern and are getting it from another source, such as user input.

Конструктор RegExp создаёт объект регулярного выражения для сопоставления текста с шаблоном.

Введение в то, что представляют собой регулярные выражения, читайте в главе «Регулярные выражения» в руководстве по JavaScript.

Интерактивный пример

Синтаксис

Возможны как литеральная запись, так и запись через конструктор:

Параметры

Если определён, может принимать любую комбинацию нижеследующих значений:

g глобальное сопоставление i игнорирование регистра при сопоставлении m сопоставление по нескольким строкам; символы начала и конца (^ и $) начинают работать по нескольким строкам (то есть, происходит сопоставление с началом или концом каждой строки (строки разделяются символами \n или \r), а не только с началом или концом всей вводимой строки) y Experimental «липкий» поиск; сопоставление в целевой строке начинается с индекса, на который указывает свойство lastIndex этого регулярного выражения (и не пытается сопоставиться с любого более позднего индекса).

Описание

Существует два способа создания объекта RegExp : литеральная запись и использование конструктора. При записи строк параметры в литеральной записи не используют символы кавычек, в то время как параметры функции-конструктора используют кавычки. Так что следующие выражения создают одинаковые регулярные выражения:

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

Конструктор объекта регулярного выражения, например, new RegExp('ab+c') , обеспечивает компиляцию регулярного выражения во время выполнения. Используйте функцию-конструктор, если вы знаете, что шаблон регулярного выражения будет меняться или если вы не знаете шаблон и получаете его из внешних источников, например, из пользовательского ввода.

При использовании функции-конструктора необходимо использовать обычные правила экранирования в строках (предварять специальные символы символом обратного слеша «\»). Например, следующие выражения эквивалентны:

Значение специальных символов в регулярных выражениях

(Точка, десятичная запятая) сопоставляется с любым символом за исключением символов новой строки: \n , \r , \u2028 или \u2029 .

Обратите внимание, что флаг многострочности m не изменяет поведение точки. Так что для сопоставления с шаблона с несколькими строками используйте набор символов [^] (конечно, если только вам не нужно поддерживать старые версии IE), он сопоставляется с любым символом, включая символы новой строки.

Например, шаблон /.н/ сопоставляется с подстрокой «ан», но не подстрокой «ну», во фразе «ну что, потанцуем».

Сопоставляется с символом цифры в базовом латинском алфавите. Эквивалентен набору символов 2 .

Например, шаблоны /\d/ и /8/ сопоставляются с подстрокой «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 не имеет собственных методов, однако, он наследует некоторые методы через цепочку прототипов.

The RegExp object is used for matching text with a pattern.

For an introduction to regular expressions, read the Regular Expressions chapter in the JavaScript Guide.

Description

Literal notation and constructor

There are two ways to create a RegExp object: a literal notation and a constructor.

  • The literal notation's parameters are enclosed between slashes and do not use quotation marks.
  • The constructor function's parameters are not enclosed between slashes but do use quotation marks.

The following three expressions create the same regular expression object:

The literal notation results in compilation of the regular expression when the expression is evaluated. Use literal notation when the regular expression will remain constant. For example, if you use literal notation to construct a regular expression used in a loop, the regular expression won't be recompiled on each iteration.

The constructor of the regular expression object—for example, new RegExp('ab+c') —results in runtime compilation of the regular expression. Use the constructor function when you know the regular expression pattern will be changing, or you don't know the pattern and obtain it from another source, such as user input.

Flags in constructor

Starting with ECMAScript 6, new RegExp(/ab+c/, 'i') no longer throws a TypeError ( "can't supply flags when constructing one RegExp from another" ) when the first argument is a RegExp and the second flags argument is present. A new RegExp from the arguments is created instead.

When using the constructor function, the normal string escape rules (preceding special characters with \ when included in a string) are necessary.

For example, the following are equivalent:

Perl-like RegExp properties

Note that several of the RegExp properties have both long and short (Perl-like) names. Both names always refer to the same value. (Perl is the programming language from which JavaScript modeled its regular expressions.) See also deprecated RegExp properties.

Constructor

Creates a new RegExp object.

Static properties

The constructor function that is used to create derived objects.

Instance properties

A string that contains the flags of the RegExp object.

Whether . matches newlines or not.

Whether to test the regular expression against all possible matches in a string, or only against the first.

Whether the regular expression result exposes the start and end indices of captured substrings.

Whether to ignore case while attempting a match in a string.

Whether or not to search in strings across multiple lines.

The text of the pattern.

Whether or not the search is sticky.

Whether or not Unicode features are enabled.

The index at which to start the next match.

Instance methods

(Re-)compiles a regular expression during execution of a script.

Executes a search for a match in its string parameter.

Tests for a match in its string parameter.

Returns a string representing the specified object. Overrides the Object.prototype.toString() method.

Performs match to given string and returns match result.

Returns all matches of the regular expression against a string.

Replaces matches in given string with new substring.

Searches the match in given string and returns the index the pattern found in the string.

Splits given string into an array by separating the string into substrings.

Examples

Using a regular expression to change data format

The following script uses the replace() method of the String instance to match a name in the format first last and output it in the format last, first.

In the replacement text, the script uses $1 and $2 to indicate the results of the corresponding matching parentheses in the regular expression pattern.

This displays "Smith, John" .

Using regular expression to split lines with different line endings/ends of line/line breaks

The default line ending varies depending on the platform (Unix, Windows, etc.). The line splitting provided in this example works on all platforms.

Note that the order of the patterns in the regular expression matters.

Using regular expression on multiple lines

Using a regular expression with the sticky flag

The sticky flag indicates that the regular expression performs sticky matching in the target string by attempting to match starting at RegExp.prototype.lastIndex .

The difference between the sticky flag and the global flag

With the sticky flag y , the next match has to happen at the lastIndex position, while with the global flag g , the match can happen at the lastIndex position or later:

With the global flag g , all 6 digits would be matched, not just 3.

Regular expression and Unicode characters

\w and \W only matches ASCII based characters; for example, a to z , A to Z , 0 to 9 , and _ .

To match characters from other languages such as Cyrillic or Hebrew, use \uhhhh , where hhhh is the character's Unicode value in hexadecimal.

This example demonstrates how one can separate out Unicode characters from a word.

The Unicode property escapes feature introduces a solution, by allowing for a statement as simple as \p .

Extracting sub-domain name from URL

Note: Instead of using regular expressions for parsing URLs, it is usually better to use the browsers built-in URL parser by using the URL API.

Specifications

Browser compatibility

BCD tables only load in the browser

Firefox-specific notes

Starting with Firefox 34, in the case of a capturing group with quantifiers preventing its exercise, the matched text for a capturing group is now undefined instead of an empty string:

Note that due to web compatibility, RegExp.$N will still return an empty string instead of undefined (bug 1053944).


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

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

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

Если с помощью JavaScript вы хотите создать регулярное выражение (описать шаблон), есть два способа это сделать.

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

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

Второй параметр — строка с флагами ( flags ). Не волнуйтесь, скоро мы с ними познакомимся. Этот параметр необязательный. Стоит запомнить одно: после создания регулярного выражения флаги уже нельзя будет добавить или убрать. Поэтому, если хотите использовать флаг, добавьте его на этапе создания выражения.

Литерал регулярных выражений

Второй способ — использование литерала. Как и конструктор, литерал регулярных выражений состоит из двух частей. Первая часть — это описываемый шаблон. Он заключается в слэши ( // ). После закрывающего слэша идёт вторая часть — флаги. Они необязательны.

Примечание: два слэша в литерале регулярных выражений используются для того, чтобы заключить в них шаблон. Если ваш шаблон предполагает использование ещё одного или нескольких прямых слэшей, их необходимо экранировать обратным слэшем ( \ ), то есть \ /.

Конструктор или литерал?

Конструктор и литерал выполняют одну функцию, но есть одно важное различие. Регулярное выражение, созданное при помощи конструктора, компилируется при выполнении программы, литерал — на этапе загрузки скрипта. Это значит, что литерал нельзя изменить динамически, в то время как конструктор — можно.

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

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

test()

Для работы с регулярными выражениями есть несколько методов. Простейший из них — test() . При использовании этого метода необходимо передать функции проверяемую строку в качестве аргумента. В результате метод возвращает булево значение: true — если в строке есть совпадения с шаблоном, false — если совпадений нет.

Ещё один метод, который можно использовать — exec() . Если есть совпадение, метод exec() возвращает массив. Массив содержит в себе информацию об используемом шаблоне, позиции, на которой было найдено совпадение, проверяемом тексте и наборах. Если совпадений нет, метод exec() возвращает null .

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

test() и exec() — не единственные методы, которые можно использовать для поиска совпадений строки с шаблоном. Есть ещё search() , match() и matchAll() . Эти методы принадлежат не объекту RegExp, а строкам. Несмотря на это, они позволяют применять регулярные выражения.

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

search()

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

match()

match() — второй метод объекта String, который позволяет использовать регулярные выражения. Он работает аналогично exec() : при нахождении совпадения метод match() возвращает массив с информацией об использованном шаблоне, позиции в строке, на которой было найдено совпадение, проверяемом тексте и наборах.

Так же как и exec() , match() возвращает null при отсутствии совпадений. При использовании метода match() с флагом g для поиска всех совпадений с шаблоном возвращается массив из всех совпадений.

matchAll()

Подобно методу match() , matchAll() возвращает все совпадения при использовании флага g в шаблоне. Однако работает он по-другому. Метод matchAll() возвращает объект RegExp String Iterator . Есть несколько способов извлечь из него все совпадения.

Во-первых, можно пройтись по объекту циклом for…of и вернуть или записать все совпадения. Также можно использовать Array.from() , чтобы создать массив из содержимого объекта, или оператор spread, который даст точно такой же результат, как и Array.from() .

Вы узнали, как создавать и использовать регулярные выражения. Теперь давайте рассмотрим процесс создания шаблонов. Простейший способ составлять регулярные выражения —применение простых шаблонов. Это значит, что необходимо создать строку с особым текстом, а затем проверить, имеет ли какая-то другая строка совпадения с этим текстом.

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

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

Символьные классы — это своеобразные сокращения для разных типов символов. К примеру, есть свои классы для букв, цифр, пробелов и т. д.

Операторы контроля

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

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

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

Наборы и диапазоны

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

Альтернация

Альтернация позволяет находить соответствие, по крайней мере, одному из нескольких выражений.

Флаги

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

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


Регулярные выражения (regex или regexp) очень эффективны для извлечения информации из текста. Для этого нужно произвести поиск одного или нескольких совпадений по определённому шаблону (т. е. определённой последовательности символов ASCII или unicode).

Области применения regex разнообразны, от валидации до парсинга/замены строк, передачи данных в другие форматы и Web Scraping’а.

Давайте начнём с нескольких примеров.

Якоря — ^ и $

Квантификаторы — * + ? и <>

Оператор ИЛИ — | или []

Символьные классы — \d \w \s и .

Используйте оператор . с осторожностью, так как зачастую класс или отрицаемый класс символов (который мы рассмотрим далее) быстрее и точнее.

У операторов \d , \w и \s также есть отрицания ― \D, \W и \S соответственно.

Например, оператор \D будет искать соответствия противоположенные \d .

Непечатаемые символы также можно искать, например табуляцию \t , новую строку \n , возврат каретки \r .

Флаги

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

Регулярное выражение, как правило, записывается в такой форме / abc /, где шаблон для сопоставления выделен двумя слешами / . В конце выражения, мы определяем значение флага (эти значения можно комбинировать):

  • g (global) ― не возвращает результат после первого совпадения, а продолжает поиск с конца предыдущего совпадения.
  • m (multi line) ― с таким флагом, операторы ^ и $ вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).
  • i (insensitive) ― делает выражение регистронезависимым (например, /aBc/i соответствует AbC).

Скобочные группы ― ()

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

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

Скобочные выражения ― []

Помните, что внутри скобочных выражений все специальные символы (включая обратную косую черту \ ) теряют своё служебное значение, поэтому нам ненужно их экранировать.

Жадные и ленивые сопоставления

Квантификаторы ( * + <> ) ― это «жадные» операторы, потому что они продолжают поиск соответствий, как можно глубже ― через весь текст.

Например, выражение <.+>соответствует

simple div
в This is a
simple div
test . Чтобы найти только тэг div ― можно использовать оператор ? , сделав выражение «ленивым»:

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

Границы слов ― \b и \B

\b ― соответствует границе слова, наподобие якоря (он похож на $ и ^ ), где предыдущий символ ― словесный (например, \w ), а следующий ― нет, либо наоборот, (например, это может быть начало строки или пробел).

\B ― соответствует несловообразующей границе. Соответствие не должно обнаруживаться на границе \b .

Обратные ссылки — \1

Опережающие и ретроспективные проверки — (?=) and (?<=)

Вы можете использовать оператор отрицания !

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

Читайте также: