Квантификаторы в JScript

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

Значение квантификаторов

Знак

Описание

*

Соответствует предыдущему символу или части выражения, повторяющимся нуль или более раз. Например, "zo*" соответствует "z" и "zoo". "*" является эквивалентом "{0,}".

+

Соответствует предыдущему символу или части выражения, повторяющимся один или более раз. Например, "zo+" соответствует "zo" и "zoo", но не "z". "+" является эквивалентом "{1,}".

?

Соответствует предыдущему символу или части выражения, повторяющимся нуль или один раз. Например, "do(es)?" соответствует "do" в слове "do" или "does". ? является эквивалентом "{0,1}".

{n}

n — это неотрицательное целое число. Строго соответствует числу раз, равному n. Например, "o{2}" не соответствует "o" в слове "Bob", но соответствует "oo" в слове "food".

{n,}

n — это неотрицательное целое число. Соответствует числу раз, равному или превышающему n. Например, "o{2,}" не соответствует букве "o" в слове "Bob", но соответствует всем буквам "o" в слове "foooood". "o{1,}" является эквивалентом "o+". "o{0,}" является эквивалентом "o*".

{n,m}

m и n — это неотрицательные целые числа, где n <= m. Соответствует числу раз, равному или превышающему n и не превышающему m. Например, "o{1,3}" соответствует первым трем буквам "o" в слове "fooooood". "o{0,1}" является эквивалентом "o?". Обратите внимание на то, что между запятой и числами нельзя вставлять пробел.

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

/Chapter [1-9][0-9]*/

Обратите внимание на то, что квантификатор стоит после выражения диапазона. Поэтому он применяется ко всему выражению диапазона, которое в данном случае задает цифры от 0 до 9 включительно.

В данной ситуации не используется квантификатор "+", так как цифра на второй или последующей позиции может отсутствовать. Знак "?" также не используется, так как номер главы может содержать более двух цифр. Вы хотите найти соответствие по крайней мере для одной цифры после слова "Глава" и знака пробела.

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

/Chapter [0-9]{1,2}/

Недостатком приведенного выше выражения является то, что поиск соответствия номера главы, превышающего 99, будет все равно выполняться по двум первым цифрам. Другим недостатком является то, что выражению удовлетворяет глава 0. Следующее выражение гораздо лучше подходит для поиска соответствия только по двум цифрам:

/Chapter [1-9][0-9]?/

или

/Chapter [1-9][0-9]{0,1}/

Квантификаторы "*", "+", и "?" называются жадными, так как они задают соответствие для всего доступного текста. Однако в некоторых случаях требуется соответствие для минимального объема данных.

Например, может выполняться поиск по документу HTML на наличие заголовка главы, заключенного в тег H1. В документе этот текст выглядит следующим образом:

<H1>Chapter 1: Introduction to Regular Expressions</H1>

Следующее выражение соответствует всем символам, начиная с открывающего знака "меньше" (<) до знака "больше" (>), закрывающего тег H1.

/<.*>/

Если вы хотите включить в соответствие только открывающий тег H1, то используйте следующее нежадное выражение, соответствующее только <H1>.

/<.*?>/

Если поместить "?" после квантификатора "*", "+" или "?", жадное выражение преобразуется в нежадное, то есть обеспечивающее минимальное совпадение.

См. также

Другие ресурсы

Знакомство с регулярными выражениями