Чтение онлайн

на главную - закладки

Жанры

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

Если же ввести условие

(?!
, то это будет негативная опережающая проверка на последующие символы, требующая, чтобы следующие символы не соответствовали указанному шаблону. Например, шаблону
/Java(?!Script)([A-Z]\w*)/
соответствует подстрока «Java», за которой следует заглавная буква и любое количество текстовых ASCII-символов при условии, что за подстрокой «
Java
» не следует подстрока «
Script
». Он совпадет со строкой «
JavaBeans
», но не совпадет со строкой «Javanese», совпадет со строкой «JavaScrip», но не совпадет со строками «JavaScript» или «JavaScripter».

В табл. 10.5 приводится перечень якорных символов регулярных выражений.

10.1.6.

Флаги

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

і
указывает, что поиск по шаблону должен быть нечувствителен к регистру символов, а флаг
d
– что поиск должен быть глобальным, т. е. должны быть найдены все соответствия в строке. Флаг
m
выполняет поиск по шаблону в многострочном режиме. Если строковое выражение, в котором выполняется поиск, содержит символы перевода строк, то в этом режиме якорные символы ^ и $, помимо того, что они соответствуют началу и концу всего строкового выражения, также соответствуют началу и концу каждой текстовой строки. Например, шаблону
/java$/im
соответствует как слово «
java
», так и «
Java\nis fun
».

Эти флаги могут объединяться в любые комбинации. Например, чтобы выполнить поиск первого вхождения слова «java» (или «Java», «JAVA» и т. д.) без учета регистра символов, можно воспользоваться нечувствительным к регистру регулярным выражением /\Ьj ava\b/i. А чтобы найти все вхождения этого слова в строке, можно добавить флаг g: /\bjava\b/gi.

В табл. 10.6 приводится перечень флагов регулярных выражений. Заметим, что флаг

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

10.2. Методы класса String для поиска по шаблону

До этого момента мы обсуждали грамматику создаваемых регулярных выражений, но не рассматривали, как эти регулярные выражения могут фактически использоваться в JavaScript-сценариях. В данном разделе мы обсудим методы объекта

String
, в которых регулярные выражения применяются для поиска по шаблону, а также для поиска с заменой. А затем продолжим разговор о поиске по шаблону с регулярными выражениями, рассмотрев объект
RegExp
, его методы и свойства. Обратите внимание, что последующее обсуждение - лишь обзор различных методов и свойств, относящихся к регулярным выражениям. Как обычно, полное описание можно найти в третьей части книги.

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

search.
Он принимает в качестве аргумента регулярное выражение и возвращает либо позицию первого символа найденной подстроки, либо
– 1
, если соответствие не найдено. Например, следующий вызов вернет 4:

"JavaScript".search(/scгіpt/i);

Если аргумент метода

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

Метод

replace
выполняет операцию поиска с заменой. Он принимает в качестве
первого аргумента регулярное выражение, а в качестве второго - строку замены.

Метод отыскивает в строке, для которой он вызван, соответствие указанному шаблону. Если регулярное выражение содержит флаг

g
, метод
герlасе
заменяет все найденные совпадения строкой замены. В противном случае он заменяет только первое найденное совпадение. Если первый аргумент метода
герlасе
является строкой, а не регулярным выражением, то метод выполняет буквальный поиск строки, а не преобразует его в регулярное выражение с помощью конструктора
RegExp,
как это делает метод
search.
В качестве примера мы можем воспользоваться методом
replace
для единообразной расстановки прописных букв в слове «JavaScript» для всей строки текста:

// Независимо от регистра символов заменяем словом в нужном регистре

text.replace(/JavaScript/gi, "JavaScript");

Метод

replace
представляет собой более мощное средство, чем можно было бы предположить по этому примеру. Напомню, что подвыражения в скобках, находящиеся внутри регулярного выражения, нумеруются слева направо, и что регулярное выражение запоминает текст, соответствующий каждому из подвыражений. Если в строке замены присутствует знак
$
с цифрой, метод
replace
заменяет эти два символа текстом, соответствующим указанному подвыражению. Это очень полезная возможность. Мы можем использовать ее, например, для замены прямых кавычек в строке типографскими кавычками, которые имитируются ASCII-символами:

// Цитата - это кавычка, за которой следует любое число символов, отличных от кавычек

// (их мы запоминаем), за этими символами следует еще одна кавычка,

var quote = /'([~"]*/g;

// Заменяем прямые кавычки типографскими и оставляем без изменений

// содержимое цитаты, хранящееся в $1.

text. replace(quote, "«$1»");

Метод

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

Метод

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

"1 плюс 2 равно 3".match(/\d+/g) // вернет ["1", "2", "3"]

Если регулярное выражение не содержит флаг

g
, метод
match
не выполняет глобальный поиск; он просто ищет первое совпадение. Однако
match
возвращает массив, даже когда метод не выполняет глобальный поиск. В этом случае первый элемент массива - это найденная подстрока, а все оставшиеся элементы представляют собой подвыражения регулярного выражения. Поэтому если
match
возвращает массив а, то а[0] будет содержать найденную строку целиком, а[1] -подстроку, соответствующую первому подвыражению, и т. д. Проводя параллель с методом
replace,
можно сказать, что в а[n] заносится содержимое $n.

Поделиться:
Популярные книги

Реванш

СветочкаN
Фантастика:
фэнтези
5.00
рейтинг книги
Реванш

Воевода

Ланцов Михаил Алексеевич
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Воевода

Князь

Мазин Александр Владимирович
3. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Князь

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Снега

Чепурин Юлий Петрович
Поэзия:
драматургия
5.00
рейтинг книги
Снега

На границе империй. Том 10. Часть 10

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 10

Боярышня Дуняша 2

Меллер Юлия Викторовна
2. Боярышня
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Боярышня Дуняша 2

Ваше Сиятельство 6

Моури Эрли
6. Ваше Сиятельство
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 6

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 23

Хроники Тириса. Книга 1

Маханенко Василий Михайлович
1. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
6.00
рейтинг книги
Хроники Тириса. Книга 1

Родословная. Том 4

Ткачев Андрей Юрьевич
4. Линия крови
Фантастика:
городское фэнтези
аниме
фэнтези
5.00
рейтинг книги
Родословная. Том 4

Глубокий космос

Вайс Александр
9. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Глубокий космос

Группа крови на рукаве

Вязовский Алексей
1. ГК
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.40
рейтинг книги
Группа крови на рукаве

Геном хищника. Книга четвертая

Гарцевич Евгений Александрович
4. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга четвертая