JavaScript. Подробное руководство, 6-е издание, стр. 139

10

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

Регулярное выражение - это объект, описывающий символьный шаблон. Класс

<b>RegExp</b>
в JavaScript представляет регулярные выражения, а объекты классов
<b>String</b>
и
<b>RegExp</b>
определяют методы, использующие регулярные выражения для выполнения поиска по шаблону и операций поиска в тексте с заменой. Грамматика регулярных выражений в языке JavaScript содержит достаточно полное подмножество синтаксиса регулярных выражений, используемого в языке Perl 5, поэтому, если вы имеете опыт работы с языком Perl, то вы без труда сможете описывать шаблоны в программах на языке JavaScript. [10]

)

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

<b>String</b>
и
<b>RegExp</b>
, которые используют регулярные выражения.

10.1. Определение регулярных выражений

В JavaScript регулярные выражения представлены объектами

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

<b>var pattern = /s$/;</b>

Эта строка создает новый объект

<b>RegExp</b>
и присваивает его переменной
<b>pattern</b>
. Данный объект
<b>RegExp</b>
ищет любые строки, заканчивающиеся символом «s». Это же регулярное выражение может быть определено с помощью конструктора RegExp():

<b>var pattern = new RegExp(&quot;s$&quot;);</b>

Спецификация шаблона регулярного выражения состоит из последовательности символов. Большая часть символов, включая все алфавитно-цифровые, буквально описывают символы, которые должны присутствовать. То есть регулярное выражение

<b>/java/</b>
совпадает со всеми строками, содержащими подстроку «java». Другие символы в регулярных выражениях не предназначены для поиска их точных эквивалентов, а имеют особое значение. Например, регулярное выражение
<b>/s$/</b>
содержит два символа. Первый символ,
<b>s</b>
, обозначает поиск буквального символа. Второй,
<b>$</b>
, - это специальный метасимвол, обозначающий конец строки. Таким образом, это регулярное выражение соответствует любой строке, заканчивающейся символом s.

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

Литералы RegExp и создание объектов

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

<b>{}</b>
и
<b>[]</b>
, каждый раз создают новые объекты. Если поместить инструкцию
<b>var а = [ ]</b>
в тело цикла, например, в каждой итерации цикла будет создаваться новый пустой массив.

Литералы регулярных выражений - особый случай. Спецификация ЕСМА-Script 3 утверждает, что литерал

<b>RegExp </b>
преобразуется в объект
<b>RegExp</b>
в ходе синтаксического анализа программного кода и каждый раз, когда интерпретатор встречает литерал
<b>RegExp</b>
, он возвращает один и тот же объект. Спецификация ECMAScript 5 изменила это положение вещей и требует, чтобы всякий раз, когда в программе встречается литерал
<b>RegExp</b>
, возвращался бы новый объект. Реализация в броузере IE всегда соответствовала поведению, соответствующему ECMAScript 5, и большинство современных броузеров также перешли на новую реализацию, раньше, чем полностью реализовали новый стандарт.

*******************************************

10.1.1. Символы литералов

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

<b>\n</b>
соответствует символу перевода строки. Эти символы перечислены в табл. 10.1.

Таблица 10.1. Символы литералов в регулярных выражениях

JavaScript. Подробное руководство, 6-е издание - i_013.jpg

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

<b>~ $ . * + ? = ! : | \ / ( ) [ ] { }</b>

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

<b>@</b>
, не имеют специального значения и просто соответствуют в регулярных выражениях самим себе.

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

<b>\</b>
, можете спокойно помещать обратный слэш перед любым из символов. Однако имейте в виду, что многие буквы и цифры вместе с символом слэша обретают специальное значение, поэтому тем буквам и цифрам, которые вы ищете буквально, не должен предшествовать символ
<b>\</b>
. Чтобы включить в регулярное выражение сам символ обратного слэша, перед ним, очевидно, следует поместить другой символ обратного слэша. Например, следующее регулярное выражение соответствует любой строке, содержащей символ обратного слэша:
<b>/\\/</b>
.

10.1.2. Классы символов

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

<b>/[abc]/</b>
соответствует одному из символов
<b>а, b</b>
или
<b>с</b>
. Могут также определяться классы символов с отрицанием, соответствующие любому символу, кроме тех, которые указаны в скобках. Класс символов с отрицанием задается символом
<b>~</b>
в качестве первого символа, следующего за левой скобкой. Регулярное выражение
<b>/[~abc]/</b>
соответствует любому символу, отличному от
<b>а</b>
,
<b>b</b>
или
<b>с</b>
. В классах символов диапазон символов может задаваться при помощи дефиса. Поиск всех символов латинского алфавита в нижнем регистре осуществляется посредством выражения
<b>/[a-z]/</b>
, а любую букву или цифру из набора символов Latin можно найти при помощи выражения
<b>/[a-zA-Z0-9]/</b>
.