Сначала, как обычно, список предыдущих постов из серии про регулярные выражения, для тех кто случано наткнулся на эту страничку. Начать лучше именно с них:
Сегодня хорошая новость для тех кому уже поднадоел оператор –match
в предыдущих статьях о регулярных выражениях 🙂 Мы уже научились не просто проверять строки на соответствие правилам, но и извлекать из них самое интересное содержимое. Но регулярные выражения позволяют не только анализировать строки, но и изменять их. Так что пора познакомится познакомиться с еще одним оператором PowerShell, который использует в своей работе регулярные выражения — -replace
. Слева от этого оператора указывается обрабатываемая строка, а справа массив состоящий из двух элементов: первый — регулярное выражение определяющее что заменяем, и второй элемент — строка на которую заменяем.
Давайте посмотрим пример:
PS C:\> "PowerShell" -replace "Power","Super" SuperShell
Так как мы уже знаем некоторые возможности регулярных выражений, мы можем использовать оператор более интересным способом:
PS C:\> "PowerShell" -replace "S.+$", "GUI" PowerGUI
Оператор -replace
замещает всю совпавшую часть выражения, то есть то что в $matches
находилось бы под индексом 0. Впрочем в -replace
можно использовать и группы захвата. Вместо помещения в $matches
, захваченные данные подставляются во второй элемент массива (то на что заменяем) с помощью символа доллара, и индекса группы, например $0
— всё совпавшее выражение, $1
— содержимое первой группы, $2
— второй, и так далее. Обратите внимание, не только в регулярных выражениях символ $
имеет дополнительные значения (якорь конца строки), но и в самом PowerShell. Так что если просто вставить $1
в строку окруженную двойными кавычками, то PowerShell попытается подставить туда значение переменной $1
, а так как такой скорее всего не существует, то он просто заменит эту последовательность на пустоту. Чтобы этого не произошло, а $1
был бы обработан оператором -replace
, следует использовать одинарные кавычки (внутри которых PowerShell не раскрывает переменные):
PS C:\> "Латинские буквы, например ABCDE, надо подчеркнуть." -replace "[a-z]+", '_$0_' Латинские буквы, например _ABCDE_, надо подчеркнуть. PS C:\> "Жирный <b>текст</b> выделяется <b>соответствующим</b> тегом." -replace "<([^<]+)>",'[$1]' Жирный [b]текст[/b] выделяется [b]соответствующим[/b] тегом.
У оператора –replace
, как и у других операторов PowerShell для работы со строками, есть и версия отличающая верхний и нижний регистр символов:
PS C:\> "Все слова начинающиеся с Заглавных Букв надо выделить." -creplace "[А-Я]\S+",'*$0*' *Все* слова начинающиеся с *Заглавных* *Букв* надо выделить.
Не все об этом знают, но второй элемент массива справа от -replace
необязательный. Если его опустить, то команда будет выполнять замену на ""
(пустоту). Именно поэтому и нет оператора -remove
🙂 Например уберём из текста всё кроме цифр:
PS C:\> "+7 911 123-45-67" -replace "\D" 79111234567
Ну и раз уж взялись за номера телефонов, отформатируем эту последовательность в нужном нам формате 🙂
PS C:\> "79111234567" -replace '^(.)(...)(...)(..)(..)$','+$1 ($2) $3-$4-$5' +7 (911) 123-45-67
Другой оператор, похожий на -replace
, это -split
. Он появился только во второй версии PowerShell. В отличии от -replace
, он разделяет строку на части и возвращает массив строк. Справа от него указывается регулярное выражение по которому он будет делить строку. В следующем примере это пробел или знак минуса:
PS C:\> "+7 911 123-45-67" -split "[- ]" +7 911 123 45 67 PS C:\> "Хакерам^не-нужны*пробелы" -split '\W' Хакерам не нужны пробелы
Еще ему можно указать максимальное количество частей в результате:
PS C:\> "+7 911 123-45-67" -split "[- ]", 3 +7 911 123-45-67
То есть, после достижения указанного количества результатов, дальнейшее деление не происходит.
Продолжение: Жадность.
18.12.2009 в 12:54
[…] – Количественные модификаторы (квантификаторы) Регулярные выражения – Операторы –replace и -split » Блог на WordPress.com. • Theme: Garland by Steven Wittens and Stefan […]
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, […]