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

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

Жанры

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

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

\s
соответствует символам пробела, табуляции и любым пробельным символам из набора Unicode, a
\S
– любым символам, не являющимся пробельными символами из набора Unicode. В табл. 10.2 приводится перечень этих спецсимволов и синтаксиса классов символов. (Обратите внимание, что некоторые из управляющих последовательностей классов символов соответствуют только ASCII-символам и не расширены для работы с Unicode-символами. Можно явно определить собственные классы Unicode-символов, например, выражение
/[\u0400-\04FF]/
соответствует любому символу кириллицы.)

Обратите внимание, что управляющие последовательности специальных символов классов могут находиться в квадратных скобках.

\s
соответствует любому пробельному символу, a
\d
соответствует любой цифре, следовательно,
/[\s\d]/
соответствует любому пробельному символу или цифре. Обратите внимание на особый случай. Как мы увидим позже, последовательность
\b
имеет особый смысл. Однако когда она используется в классе символов, то обозначает символ «забой». Поэтому, чтобы обозначить символ «забой» в регулярном выражении буквально, используйте класс символов с одним элементом:
/[\b]/
.

10.1.3. Повторение

Имея знания синтаксиса регулярных выражений, полученные к настоящему моменту, мы можем описать число из двух цифр как

/\d\d/
или из четырех цифр как
/\d\d\d\d/
, но не сможем, например, описать число, состоящее из любого количества цифр, или строку из трех букв, за которыми следует необязательная цифра. Эти более сложные шаблоны используют синтаксис регулярных выражений, указывающий, сколько раз может повторяться данный элемент регулярного выражения.

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

+
соответствует одному или нескольким экземплярам предыдущего шаблона. В табл. 10.3 приведена сводка синтаксиса повторений.

Следующие строки демонстрируют несколько примеров:

/\d{2,4}/ // Соответствует числу, содержащему от двух до четырех цифр

/\w{3}\d?/ // Соответствует в точности трем символам слова

// и одной необязательной цифре

/\s+java\s+/ // Соответствует слову "java" с одним или более пробелами

// до и после него

/[~(]*/ // Соответствует нулю или более символам, отличным от открывающей круглой

// скобки

Будьте внимательны при использовании символов повторения

*
и
?
. Они могут соответствовать отсутствию указанного перед ними шаблона и, следовательно, отсутствию символов. Например, регулярному выражению
/а*/
соответствует строка «
bbbb
», поскольку в ней нет символа
а
!

10.1.3.1. «Нежадное» повторение

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

выражения. Мы говорим, что это - «жадное» повторение. Имеется также возможность реализовать повторение, выполняемое «нежадным» способом. Достаточно указать после символа (или символов) повторения вопросительный знак:
??, +?, *?
или даже
{1,5}?
. Например, регулярное выражение
/а+/
соответствует одному или более экземплярам буквы
а
. Примененное к строке «
ааа
», оно соответствует всем трем буквам. С другой стороны, выражение
/а+?/
соответствует одному или более экземплярам буквы
а
и выбирает наименее возможное число символов. Примененный к той же строке, этот шаблон соответствует только первой букве
а
.

«Нежадное» повторение не всегда дает ожидаемый результат. Рассмотрим шаблон

/а+b/
, соответствующий одному или более символам
а
, за которыми следует символ
Ь
. Применительно к строке «
аааb
» ему соответствует вся строка. Теперь проверим «нежадную» версию
/а+?b/
. Можно было бы подумать, что она должна соответствовать символу
b
, перед которым стоит только один символ
а
. В случае применения к той же строке «
аааЬ
» можно было бы ожидать, что она совпадет с единственным символом
а
и последним символом
b
. Однако на самом деле этому шаблону соответствует вся строка, как и в случае «жадной» версии. Дело в том, что поиск по шаблону регулярного выражения выполняется путем нахождения первой позиции в строке, начиная с которой соответствие становится возможным. Так как соответствие возможно, начиная с первого символа строки, более короткие соответствия, начинающиеся с последующих символов, даже не рассматриваются.

10.1.4. Альтернативы, группировка и ссылки

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

|
служит для разделения альтернатив. Например,
/ab|cd|ef/
соответствует либо строке «
аЬ
», либо строке «
cd
», либо строке «
ef
», а шаблон
/\d{3}|[a-z]{4}/
– либо трем цифрам, либо четырем строчным буквам.

Обратите внимание, что альтернативы обрабатываются слева направо до тех пор, пока не будет найдено соответствие. При обнаружении совпадения с левой альтернативой правая игнорируется, даже если можно добиться «лучшего» соответствия. Поэтому, когда к строке «

аЬ
» применяется шаблон
/а|аЬ/
, он будет соответствовать только первому символу.

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

|, *, +, ?
и других рассматриваются как одно целое. Например, шаблон
/java(script)?/
соответствует слову «java», за которым следует необязательное слово «script», a
/(ab|cd)+|ef)/
соответствует либо строке «
ef
», либо одному или более повторений одной из строк «
аЬ
» или «
cd
».

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

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

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

Геном хищника. Книга шестая

Гарцевич Евгений Александрович
6. Я - Легенда!
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Геном хищника. Книга шестая

Двойник короля 17

Скабер Артемий
17. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 17

Законы Рода. Том 9

Мельник Андрей
9. Граф Берестьев
Фантастика:
городское фэнтези
попаданцы
аниме
дорама
фэнтези
фантастика: прочее
5.00
рейтинг книги
Законы Рода. Том 9

Последний Паладин. Том 14

Саваровский Роман
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Последний Паладин. Том 14

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Пламя

Сокол Лена
3. ПОЖАРНАЯ ЧАСТЬ 17
Любовные романы:
современные любовные романы
прочие любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Пламя

Революция

Валериев Игорь
9. Ермак
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Революция

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

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

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Солнечный флот

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

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Дважды одаренный. Том VII

Тарс Элиан
7. Дважды одаренный
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Дважды одаренный. Том VII

Бастард Императора. Том 4

Орлов Андрей Юрьевич
4. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 4