Регулярные выражения – Операторы -replace и -split

regexp-5 Сначала, как обычно, список предыдущих постов из серии про регулярные выражения, для тех кто случано наткнулся на эту страничку. Начать лучше именно с них:

  • Введение
  • Отрицательные группы и якоря
  • Количественные модификаторы (квантификаторы)
  • Группы захвата

    Сегодня хорошая новость для тех кому уже поднадоел оператор –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

    То есть, после достижения указанного количества результатов, дальнейшее деление не происходит.

    Продолжение: Жадность.

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

    комментария 4 to “Регулярные выражения – Операторы -replace и -split”

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

      […] – Количественные модификаторы (квантификаторы) Регулярные выражения – Операторы –replace и -split » Блог на WordPress.com. • Theme: Garland by Steven Wittens and Stefan […]

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

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

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

      […] и якорями, квантификаторами, группами захвата, операторами –replace и –split, а так же с концепцией “жадности”. Пришло время […]

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

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


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

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