принимает один или два строковых аргумента и создает новый объект
RegExp
. Первый аргумент конструктора - это строка, содержащая тело регулярного выражения, т. е. текст, который должен находиться между символами слэша в литерале регулярного выражения. Обратите внимание, что в строковых литералах и регулярных выражениях для обозначения управляющих последовательностей используется символ
\
, поэтому, передавая конструктору
RegExp
регулярное выражение в виде строкового литерала, необходимо заменить каждый символ
\
парой символов
\\
. Второй аргумент
RegExp
может отсутствовать. Если он указан, то определяет флаги регулярного выражения. Это должен быть один из символов
g, i, m
либо комбинация этих символов. Например:
//
Находит все пятизначные числа в строке. Обратите внимание
// на использование в этом примере символов \\
var zipcode = new RegExp(\\d{5}, "g");
Конструктор
RegExp
удобно использовать, когда регулярное выражение создается динамически и поэтому не может быть представлено с помощью синтаксиса литералов регулярных выражений. Например, чтобы найти строку, введенную, пользователем, надо создать регулярное выражение во время выполнения с помощью
RegExp.
10.3.1. Свойства RegExp
Каждый объект
RegExp
имеет пять свойств. Свойство
source
– строка, доступная только для чтения, содержащая текст регулярного выражения. Свойство
global
– логическое значение, доступное только для чтения, определяющее наличие флага
g
в регулярном выражении. Свойство
ignoreCase
– это логическое значение, доступное только для чтения, определяющее наличие флага
і
в регулярном выражении. Свойство
multiline
– это логическое значение, доступное только для чтения, определяющее наличие флага
m
в регулярном выражении. И последнее свойство
lastlndex
– это целое число, доступное для чтения и записи. Для шаблонов с флагом
g
это свойство содержит номер позиции в строке, с которой должен быть начат следующий поиск. Как описано ниже, оно используется методами
ехес
и
test.
10.3.2. Методы RegExp
Объекты
RegExp
определяют два метода, выполняющие поиск по шаблону; они ведут себя аналогично методам класса
String
, описанным выше. Основной метод класса
RegExp
, используемый для поиска по шаблону, -
ехес.
Он похож на упоминавшийся метод
match
класса
String
, за исключением того, что является методом класса
RegExp
, принимающим в качестве аргумента строку, а не методом класса
String
, принимающим аргумент
RegExp
. Метод
ехес
выполняет регулярное выражение для указанной строки, т. е. ищет совпадение в строке. Бели совпадение не найдено, метод возвращает
null
. Однако если соответствие найдено, он возвращает такой же массив, как массив, возвращаемый методом
match
для поиска без флага
g
. Нулевой элемент массива содержит строку, соответствующую регулярному выражению, а все последующие элементы - подстроки, соответствующие всем подвыражениям. Кроме того, свойство
index
содержит номер позиции символа, которым начинается соответствующий фрагмент, а свойство
input
ссылается на строку, в которой выполнялся поиск.
В отличие от
match,
метод
ехес
возвращает массив, структура которого не зависит от наличия в регулярном выражении флага
g
. Напомню, что при передаче глобального регулярного выражения метод
match
возвращает массив найденных соответствий. А
ехес
всегда возвращает одно соответствие, но предоставляет о нем полную информацию. Когда
ехес
вызывается для регулярного выражения, содержащего флаг
g
, метод устанавливает свойство
lastlndex
объекта регулярного выражения равным номеру позиции символа, следующего непосредственно за найденной подстрокой. Когда метод
ехес
вызывается для того же регулярного выражения второй раз, он начинает поиск с символа, позиция которого указана в свойстве
lastlndex
. Если
ехес
не находит соответствия, свойство
lastindex
получает значение 0. (Вы также можете установить
lastlndex
в ноль в любой момент, что следует делать во всех тех случаях, когда поиск завершается до того, как будет найдено последнее соответствие в одной строке, и начинается поиск в другой строке с тем же объектом
RegExp
.) Это особое поведение позволяет вызывать
exec
повторно для перебора всех соответствий регулярному выражению в строке. Например:
var pattern = /Java/g;
var text = "JavaScript - это более забавная штука, чем Java!";
var result;
while((result = pattern.exec(text)) != null) {
alert("Найдено '" + result[0] + ..... +
в позиции " + result.index +
"; следующий поиск начнется с " + pattern.lastlndex);
}
Еще один метод объекта
RegExp - test,
который намного проще метода
ехес.
Он принимает строку и возвращает
true
, если строка соответствует регулярному выражению:
var pattern = /java/і;
pattern.test("JavaScript"); // Вернет true
Вызов
test
эквивалентен вызову
exec,
возвращающему true, если
exec
возвращает не
null
. По этой причине метод
test
ведет себя так же, как метод
ехес
при вызове для глобального регулярного выражения: он начинает искать указанную строку с позиции, заданной свойством
lastlndex
, и если находит соответствие, устанавливает свойство
lastlndex
равным номеру позиции символа, непосредственно следующего за найденным соответствием. Поэтому с помощью метода
test
можно так же сформировать цикл обхода строки, как с помощью метода
ехес.
Методы
search, replace
и
match
класса String не используют свойство
lastlndex
, в отличие от методов
ехес
и
test.
На самом деле методы класса
String
просто сбрасывают
lastlndex
в 0. Если метод
ехес
или
test
использовать с шаблоном, в котором установлен флаг
g
, и выполнить поиск в нескольких строках, то мы должны либо найти все соответствия в каждой строке, чтобы свойство
lastlndex
автоматически сбросилось в ноль (это происходит, когда последний поиск оказывается неудачным), либо явно установить свойство
lastlndex
равным нулю. Если этого не сделать, поиск в новой строке может начаться с некоторой произвольной позиции, а не с начала. Если регулярное выражение не включает флаг
g
, то вам не придется беспокоиться об этом. Имейте также в виду, что в ECMAScript 5, когда интерпретатор встречает литерал регулярного выражения, он создает новый объект
RegExp
, со своим собственным свойством
lastlndex
, что снижает риск использования «левого» значения
lastlndex
по ошибке.
11
Подмножества и расширения JavaScript
До сих пор в книге описывалась официальная версия языка JavaScript, соответствующая стандартам ECMAScript 3 и ECMAScript 5. В этой главе, напротив, будет идти речь о подмножествах и надмножествах языка JavaScript. Подмножества языка были определены, по большей части, для обеспечения более высокого уровня безопасности: сценарий, использующий только безопасное подмножество языка, может использоваться без опаски, даже если он был получен из непроверенного источника, такого как рекламный сервер. В разделе 11.1 описываются некоторые из этих подмножеств.
Стандарт ECMAScript 3 был опубликован в 1999 году, и прошло десять лет, прежде чем стандарт был обновлен до версии ECMAScript 5, вышедшей в 2009 году. Брендан Эйх (Brendan Eich), создатель JavaScript, продолжал развивать язык на протяжении всех этих десяти лет (спецификация ECMAScript явно разрешает расширение языка) и совместно с проектом Mozilla выпустил версии JavaScript 1.5, 1.6, 1.7, 1.8 и 1.8.1 в Firefox 1.0, 1.5, 2, 3 и 3.5. Некоторые из расширенных особенностей JavaScript вошли в стандарт ECMAScript 5, но многие остаются нестандартизованными. Однако, как ожидается, некоторые из оставшихся нестандартных особенностей будут стандартизованы в будущем.
Эти расширения поддерживаются броузером Firefox, точнее, реализованным в нем интерпретатором Spidermonkey языка JavaScript. Созданный проектом Mozilla интерпретатор Rhino языка JavaScript, написанный на языке Java (раздел 12.1), также поддерживает большинство расширений. Однако, поскольку эти расширения языка не являются стандартными, они не особенно полезны для веб-разработчиков, которым требуется обеспечить совместимость своих веб-приложений со всеми броузерами. Тем не менее они описываются в этой главе, потому что они: