Предыдущие посты из серии:
Что ж, мы уже немало узнали о символьных группах и якорях. Это неплохое начало, но обычно регулярные выражения гораздо сложнее, и записывать их по одному символу было бы тяжеловато. Что если вам нужно отобрать строки состоящие из четырех символов, каждый из которых может быть буквой от 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 "^бобры?$" бобр бобры
Продолжение: Группы захвата
4.12.2009 в 13:25
Спасибо за статью.
У меня правда возник некий вопрос о непосредственно применении в PoSh. Василий, хотябы пару слов о ускорителе типов [regex], если можно, просто чтобы понимать что он из себя представляет.
4.12.2009 в 13:27
Ну непосредственно на PowerShell вроде и демонстрирую 🙂 Сейчас просто разберемся с основами на примере простого -match, а затем пойду дальше, и про [regex] ни в коем случае не забуду 🙂
14.12.2009 в 12:40
[…] Количественные модификаторы (квантификаторы) […]
18.12.2009 в 12:51
[…] Количественные модификаторы (квантификаторы) […]
24.12.2009 в 12:04
[…] Регулярные выражения – Жадность 24.12.2009 — Xaegr Просто отличное название для очередной статьи о регулярных выражениях в блоге посвященном PowerShell Но оно действительно подходит лучше всего. Сегодня мы поговорим об одной важной концепции регулярных выражений. От чего зависит сколько символов будет захвачено количественным модификатором с варьирующейся длинной? Именно от жадности Если вы наткнулись на пост случайно, то сначала лучше ознакомьтесь с предыдущими постами серии – 1,2,3,4,5. […]
28.12.2009 в 12:10
[…] с основами, отрицательными группами и якорями, квантификаторами, группами захвата, операторами –replace и –split, а так же с […]
24.2.2010 в 11:00
[…] на посты которые рекомендуется прочитать сначала: 1, 2, 3, 4, 5, 6, […]