ТОР 5 статей: Методические подходы к анализу финансового состояния предприятия Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века Характеристика шлифовальных кругов и ее маркировка Служебные части речи. Предлог. Союз. Частицы КАТЕГОРИИ:
|
Отрицательные группы и якоря
Рассмотрим некоторые более “продвинутые” конструкции регулярных выражений. Предполагается, что вы уже знаете, как указать регулярному выражению, какие символы и/или их последовательности должны быть в строке для совпадения. А что если нужно указать не те символы, которые должны присутствовать, а те которых не должно быть? То есть если нужно вывести лишь согласные буквы, вы можете их перечислить, а можете использовать и отрицательную группу с гласными, например: PS C:\> "a","b","c","d","e","f","g","h" -match "[^aoueyi]" b c d f g h "Крышка" в качестве первого символа группы символов означает именно отрицание. То есть на месте группы может присутствовать любой символ кроме перечисленных в ней. Для того чтобы включить отрицание в символьных группах (\d, \w, \s), не обязательно заключать их в квадратные скобки, достаточно перевести их в верхний регистр. Например \D будет означать "что угодно, кроме цифр", а \S "всё кроме пробелов" PS C:\> "a","b","1","c","45" -match "\D" a b c PS C:\> "a","-","*","c","&" -match "\W" - * & Символьные группы позволяют указать лишь содержимое одной позиции, один символ, находящийся в неопределенном месте строки. А что если надо например выбрать все слова которые начинаются с буквы w? Если просто поместить эту букву в регулярное выражение, то оно совпадёт для всех строк, где w вообще встречается, и не важно – в начале, в середине или в конце строки. В таких случаях на помощь приходят " якоря ". Они позволяют производить сравнение, начиная с определенной позиции в строке. ^ (крышка) является якорем начала строки, а $ (знак доллара) - обозначает конец строки. Не запутайтесь - ^ как символ отрицания используется лишь в начале группы символов, а вне группы - этот символ является уже якорем. Авторам регулярных выражений явно не хватало специальных символов, и они по возможности использовали их более чем в одном месте. Пример. Вывод списка процессов, имена которых начинаются с буквы w:
PS C:\> Get-Process | where {$_.name -match "^w"}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName --- ------ ----- ----- ----- ------ -- ----------- 80 10 1460 156 47 0,11 452 wininit 114 9 2732 1428 55 0,56 3508 winlogon 162 11 3660 1652 44 0,14 3620 wisptis 225 20 5076 4308 95 31,33 3800 wisptis
Эта команда вывела процессы, у которых сразу после начала имени (^) следует символ w. Иначе говоря, имя начинается на w. Для усложнения примера, и для упрощения понимания, добавим сюда “крышку” в значении отрицательной группы: PS C:\> Get-Process | where {$_.name -match "^w[^l-z]"}
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ------- 80 10 1460 156 47 0,11 452 wininit 114 9 2732 1428 55 0,56 3508 winlogon 162 11 3660 1652 44 0,14 3620 wisptis 225 20 5076 4308 95 31,50 3800 wisptis Теперь команда вывела процессы, у которых имя начинается с символа w, а следующий символ является чем угодно, только не символом из диапазона l-z. Для закрепления опробуем второй якорь – конец строки: PS C:\> "Яблоки","Груши","Дыня","Енот","Апельсины","Персик" -match "[ыи]$" Яблоки Груши Апельсины Это выражение вывело нам все слова в которых последняя буква И или Ы. Если вы можете точно описать содержимое всей строки, то вы можете использовать и оба якоря одновременно: PS C:\> "abc","adc","aef","bca","aeb","abec","abce" -match "^a.[cb]$" abc adc aeb Это регулярное выражение выводит все строки, которые начинаются с буквы А, за которой следует один любой символ (точка), затем символ C или B и затем конец строки. Обозначения некоторых классов символов (метасимволы) приведены в табл. 3
Не нашли, что искали? Воспользуйтесь поиском:
|