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("s$");</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. Символы литералов в регулярных выражениях
Некоторые знаки препинания имеют в регулярных выражениях особый смысл:
<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>
.