Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ASCII и latin.docx
Скачиваний:
3
Добавлен:
08.08.2019
Размер:
190.09 Кб
Скачать

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

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

цифр /\d\d/ или из четырех цифр /\d\d\d\d/, но не сможем, например, описать

число, состоящее из любого количества цифр, или строку из трех букв, за кото

рыми следует необязательная цифра. Эти более сложные шаблоны используют

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

ряться данный элемент регулярного выражения.

Символы, обозначающие повторение, всегда следуют за шаблоном, к которому

они применяются. Некоторые виды повторений используются довольно часто,

и для обозначения этих случаев имеются специальные символы. Например, + со

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

В табл. 11.3 приведена сводка синтаксиса повторений.

Таблица 11.3. Символы повторения в регулярных выражениях

В следующих строках показано несколько примеров:

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

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

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

/\s+java\s+/ // Соответствует слову "java" с одним или несколькими

// пробелами до и после него

/[^"]*/ // Соответствует нулю или более символам, отличным от кавычек

Будьте осторожны при использовании символов повторения * и ?. Они могут со

ответствовать отсутствию указанного перед ними шаблона и, следовательно, от

сутствию символов. Например, регулярному выражению /a*/ соответствует

строка "bbbb", поскольку в ней нет символа a!

Символ Значение

{n,m} Соответствует предшествующему шаблону, повторенному не менее n, но

не более m раз

{n,} Соответствует предшествующему шаблону, повторенному n или более раз

{n} Соответствует в точности n экземплярам предшествующего шаблона

? Соответствует нулю или одному экземпляру предшествующего шаблона;

предшествующий шаблон является необязательным. Эквивалентно {0,1}

+ Соответствует одному или более экземпляру предшествующего шаблона.

Эквивалентно {1,}

* Соответствует нулю или более экземплярам предшествующего шаблона.a

Эквивалентно {0,}

a Как и для символа ?, предшествующий символу * шаблон может отсутствовать,

этот случай толкуется как: «предшествующий символ шаблона – любой из симво

лов». Именно это делает символы повторения ? и * одними из наиболее используе

мых.11.1. Определение регулярных выражений 219

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

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

ния альтернатив, подвыражений группировки и ссылок на предыдущие подвы

ражения. Символ вертикальной черты | служит для разделения альтернатив.

Например, /ab|cd|ef/ соответствует либо строке «ab», либо строке «cd», либо

строке «ef», а шаблон /\d{3}|[az]{4}/ – либо трем цифрам, либо четырем строч

ным буквам.

Обратите внимание: альтернативы обрабатываются слева направо до тех пор, по

ка не будет найдено соответствие. Если левая альтернатива найдена, правая иг

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

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

вому символу.

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

них – группировка отдельных элементов в одно подвыражение, так что элементы

при использовании спецсимволов |, *, +, ? и прочих спецсимволов рассматрива

ются как одно целое. Например, /java(script)?/ соответствует слову «java», за ко

торым следует необязательное слово «script», а /(ab|cd)+|ef)/ соответствует либо

строке «ef», либо одному или более повторений одной из строк «ab» или «cd».

Другим применением скобок в регулярных выражениях является определение

подшаблонов внутри шаблона. Когда в целевой строке найдено соответствие ре220 Глава 11. Шаблоны и регулярные выражения

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

любому конкретному подшаблону, заключенному в скобки. (Мы увидим, как по

лучить эти подстроки, позднее в этой главе.) Предположим, что требуется оты

скать одну или более букв в нижнем регистре, за которыми следует одна или не

сколько цифр. Для этого можно воспользоваться шаблоном /[az]+\d+/. Но пред

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

Если мы поместим эту часть шаблона в круглые скобки (/[az]+(\d+)/), то смо

жем извлечь цифры из любых найденных нами соответствий. Позднее я объяс

ню, как это делается.

С этим связано еще одно применение подвыражений в скобках, позволяющее де

лать ссылку назад к подвыражению из предыдущей части того же регулярного

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

символа \. Цифры ссылаются на позицию подвыражения в скобках внутри регу

лярного выражения. Например, \1 ссылается на первое подвыражение, а \3 – на

третье. Обратите внимание: поскольку подвыражения могут быть вложены одно

в другое, при подсчете используется позиция левой скобки. Например, в следую

щем регулярном выражении ссылка на вложенное подвыражение ([Ss]cript) бу

дет выглядеть как \2:

/([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/

Ссылка на подвыражение регулярного выражения указывает не на шаблон этого

подвыражения, а на найденный текст, соответствующий этому шаблону. Поэто

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

части строки, содержащие точно такие же символы. Например, следующее регу

лярное выражение соответствует нулю или более символам внутри одинарных

или двойных кавычек. Однако оно не требует, чтобы открывающие и закрываю

щие кавычки соответствовали друг другу (т. е. чтобы обе кавычки были одинар

ными или двойными):

/['"][^'"]*['"]/

Соответствия кавычек мы можем потребовать посредством такой ссылки:

/(['"])[^'"]*\1/

Здесь \1 соответствует результату поиска в соответствии с первым подвыражени

ем. В этом примере ссылка налагает ограничение, требующее, чтобы закрываю

щая кавычка соответствовала открывающей. Это регулярное выражение не до

пускает присутствия одинарных кавычек внутри двойных, и наоборот. Недопус

тимо помещать ссылки внутрь классов символов, т. е. мы не можем написать:

/(['"])[^\1]*\1/

Позднее в этой главе мы увидим, что этот вид ссылок на подвыражения представ

ляет собой мощное средство для использования регулярных выражений в опера

циях поиска/замены.

В JavaScript 1.5 (но не в JavaScript 1.2) возможна группировка элементов в регу

лярном выражении без создания нумерованной ссылки на эти элементы. Вместо

простой группировки элементов между ( и ) начните группу с символов (?: и за

кончите ее символом ). Рассмотрим, например, следующий шаблон:

/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/11.1. Определение регулярных выражений 221

Здесь подвыражение (?:[Ss]cript) нужно только для группировки, чтобы к груп

пе мог быть применен символ повторения ?. Эти модифицированные скобки не

создают ссылку, поэтому в данном регулярном выражении \2 ссылается на текст,

соответствующий шаблону (fun\w*).

В табл. 11.4 приводится перечень операторов альтернативы, группировки и ссыл

ки в регулярных выражениях.

Таблица 11.4. Символы альтернативы, группировки и ссылки

в регулярных выражениях

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]