Регулярные выражения – Количественные модификаторы (квантификаторы)

regexp-3

Предыдущие посты из серии:

Что ж, мы уже немало узнали о символьных группах и якорях. Это неплохое начало, но обычно регулярные выражения гораздо сложнее, и записывать их по одному символу было бы тяжеловато. Что если вам нужно отобрать строки состоящие из четырех символов, каждый из которых может быть буквой от A до F или цифрой? Регулярное выражение могло бы выглядеть примерно так:

 

PS C:\> "af12","1FE0","1fz1","B009","C1212" -match "^[a-f\d][a-f\d][a-f\d][a-f\d]$"
af12
1FE0
B009

Не слишком то лаконично, не правда ли?🙂 К счастью всю эту конструкцию можно значительно сократить. Для этого в регулярных выражениях существует специальная концепция — "количественные модификаторы" (квантификаторы). Эти модификаторы приписываются к любой группе справа, и оговаривают количество вхождений этой группы. Например количественный модификатор {4} означает 4 вхождения. Посмотрим на нашем примере:

PS C:\> "af12","1FE0","1fz1","B009","C1212" -match "^[a-f\d]{4}$"
af12
1FE0
B009

Данное регулярное выражение полностью эквивалентно предыдущему — "4 раза по [a-f\d]". Но этот количественный модификатор не обязательно жестко оговаривает количество повторений. Можно например задать количество как "от 4 до 6". Делается это указанием внутри фигурных скобок двух чисел через запятую — минимума и максимума:

PS C:\> "af12","1FE0","1fA999","B009","C1212","A00062","FF00FF9" -match "^[a-f\d]{4,6}$"
af12
1FE0
1fA999
B009
C1212
A00062

Если вам безразлично максимальное количество вхождений, например вы хотите указать "3 вхождения или больше", то максимум можно просто опустить (оставив запятую на месте), например "строка состоящая из 3х или более цифр":

PS C:\> "1","12","123","1234","12345" -match "^\d{3,}$"
123
1234
12345

Минимальное значение опустить не получится, впрочем можно просто указать единицу:

PS C:\> "1","12","123","1234","12345" -match "^\d{1,3}$"
1
12
123

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

+ (плюс), эквивалентен {1,} то есть, "одно или больше вхождений"

* (звездочка), то же самое что и {0,} или если на русском языке — "любое количество вхождений, в том числе и 0"

? (вопросительный знак), равен {0,1} — "либо одно вхождение, либо полное отсутствие вхождений".

Помните, в регулярных выражениях, количественные модификаторы сами по себе использоваться не могут. Для них обязателен символ или символьная группа, которые и будут определять их смысл. Вот несколько примеров:

.+ Один или более любых символов. Аналог ?* в простых подстановках (как в cmd.exe). Следующее выражение выбирает процессы у которых имя "начинается с буквы S, затем следует 1 или более любых символов, затем снова буква S и сразу после неё конец строки". Иначе говоря "имена которые начинаются и заканчиваются на S":

PS C:\> Get-Process | where {$_.name -match "^s.+s$"}

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    257      14     6540       5220    53     5,97    508 services
     30       2      424        128     5     0,08    280 smss

\S* Любое количество символов не являющихся пробелами. Помните, подобное выражение может совпасть и с ""(с пустой строкой), ведь под любым количеством подразумевается и ноль, то есть 0 вхождений — тоже результат.

PS C:\> "abc", "cab", "a c","ac","abdec" -match "a\S*c"
abc
ac
abdec

Заметьте, строка "ac" тоже совпала, хотя между буквами A и C вообще не было символов. Если заменить * на + то будет иначе:

PS C:\> "abc", "cab", "a c","ac","abdec" -match "a\S+c"
abc
abdec

бобры? (Это был не вопрос, а регулярное выражение😉 ) Последовательность "бобр", после которой может идти символ "ы", а может и отсутствовать:

PS C:\> "бобр","бобры","бобрята" -match "^бобры?$"
бобр
бобры

Продолжение: Группы захвата

Опубликовано в Regular Expressions. Метки: . 7 комментариев »

комментариев 7 to “Регулярные выражения – Количественные модификаторы (квантификаторы)”

  1. Юрий Says:

    Спасибо за статью.
    У меня правда возник некий вопрос о непосредственно применении в PoSh. Василий, хотябы пару слов о ускорителе типов [regex], если можно, просто чтобы понимать что он из себя представляет.

    • Xaegr Says:

      Ну непосредственно на PowerShell вроде и демонстрирую🙂 Сейчас просто разберемся с основами на примере простого -match, а затем пойду дальше, и про [regex] ни в коем случае не забуду🙂

  2. Группы захвата « PowerShell и другие скрипты Says:

    […] Количественные модификаторы (квантификаторы) […]

  3. Регулярные выражения – Операторы –replace и -split « PowerShell и другие скрипты Says:

    […] Количественные модификаторы (квантификаторы) […]

  4. Регулярные выражения – Жадность « PowerShell и другие скрипты Says:

    […] Регулярные выражения – Жадность 24.12.2009 — Xaegr Просто отличное название для очередной статьи о регулярных выражениях в блоге посвященном PowerShell Но оно действительно подходит лучше всего. Сегодня мы поговорим об одной важной концепции регулярных выражений. От чего зависит сколько символов будет захвачено количественным модификатором с варьирующейся длинной? Именно от жадности Если вы наткнулись на пост случайно, то сначала лучше ознакомьтесь с предыдущими постами серии – 1,2,3,4,5. […]

  5. Регулярные выражения – Select-String « PowerShell и другие скрипты Says:

    […] с основами, отрицательными группами и якорями, квантификаторами, группами захвата, операторами –replace и –split, а так же с […]

  6. Регулярные выражения – Switch « PowerShell и другие скрипты Says:

    […] на посты которые рекомендуется прочитать сначала: 1, 2, 3, 4, 5, 6, […]


Обсуждение закрыто.

%d такие блоггеры, как: