JavaScript. Подробное руководство, 6-е издание
Шрифт:
Например, взгляните на следующий программный код, выполняющий разбор URL-адреса:
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "Посетите мою домашнюю страницу http://www.exarnple.com/"david ";
var result = text.match(url);
if (result != null) {
var fullurl = result[0]; // Содержит " http://www.example.com/"david "
var protocol = result[1]; // Содержит "http"
var host = result[2]; // Содержит " www.example.com "
var path = result[3]; // Содержит "david"
}
Следует отметить, что для регулярного выражения, в котором не установлен флаг
g
глобального поиска, метод match
возвращает то же значение, что и метод ехес
регулярного выражения: возвращаемый массив имеет свойства index
и input
, как описывается в обсуждении метода ехес
ниже. Последний из методов объекта
String
, в котором используются регулярные выражения, - split.
Этот метод разбивает строку, для которой он вызван, на массив подстрок, используя аргумент в качестве разделителя. Например:
"123,456,789".split(","); // Вернет ["123","456","789"]
Метод
split
может также принимать в качестве аргумента регулярное выражение. Это делает метод более мощным. Например, можно указать разделитель, допускающий произвольное число пробельных символов с обеих сторон:
"1, 2, 3 , 4 , 5".split(/\s*,\s*/); // Вернет ["1","2","З","4","5"]
Метод
split
имеет и другие возможности. Полное описание приведено в третьей части книги при описании метода String. split.
10.3. Объект RegExp
Как было упомянуто в начале этой главы, регулярные выражения представлены в виде объектов
RegExp
. Помимо конструктора RegExp,
объекты RegExp
поддерживают три метода и несколько свойств. Методы поиска и свойства класса RegExp
описаны в следующих двух подразделах. Конструктор
RegExp
принимает один или два строковых аргумента и создает новый объект 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);
Поделиться:
Популярные книги
Гримуар темного лорда III
3. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Искатель 2
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Курсант: назад в СССР
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Драйв Астарты
5. Конфедерация Меганезия
Фантастика:
фэнтези
5.00
рейтинг книги
Путь разума. Том 12
12. Путь Разума
Фантастика:
рпг
уся
фэнтези
сянься
5.00
рейтинг книги
Третий Генерал: Тома I-II
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Печать Пожирателя 3
3. Пожиратель
Фантастика:
городское фэнтези
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Хозяин Стужи 4
4. Злой Лед
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 3
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Дважды одаренный. Том II
2. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Полонянин
2. Ночь Сварога
Приключения:
исторические приключения
8.30
рейтинг книги
Дважды одаренный. Том IV
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00