Feeds:
Записи
Комментарии

Archive for Июнь 2018

Оператор -replace в PowerShell — является упрощенной реализацией метода Replace класса System.Text.RegularExpressions.Regex –> альяс в [regex]::Replace.

Реализация оператора –replace в PowerShell Core методом internal static object ReplaceOperator.

Синтаксис:

PowerShell Desktop

          input –[ci]replace pattern, [replacement]

PowerShell Core

          input –[ci]replace pattern, [replacement]

          input –replace pattern, [evaluator]

  [] – необязательные аргументы

   input – входная строка или массив строк

   pattern – шаблон регулярного выражения

   replacement – строка замены

   evaluator — пользовательский метод, анализирующий каждое совпадение и возвращающий либо исходную строку с совпадениями, либо строку замены.

 

Большинство –op операторов, представлены в двух версиях:

-creplace : с учетом регистра (case sensitive (-cop)) , указывается опция RegexOptions.None

-ireplace = replace : без учета регистра (case-insensitive (-iop)) , указывается опция RegexOptions.IgnoreCase

Пару условных правил:

  1. -replace не изменяет первоначальную строку, а возвращает новый объект строки в измененном варианте
  2. при несовпадении шаблона, строка возвращается как есть
  3. при отсутствии шаблона используется ""

Примеры:

# input -[ci]replace pattern

PS > "Hello" -replace "ll"
Heo

PS > "Hello" -ireplace "h"
ello

PS > "Hello" -creplace "h"
Hello

# input –[ci]replace pattern, [replacement]

PS > "aabc" -replace "a","b"
bbbc

PS > "Abcd" -ireplace "a","B"
Bbcd

PS > "Abcd" -creplace "[a-z]","B"
ABBB
  

В PowerShell Core добавили  параметр evaluator, который может принимать следующие значения:

  1. ScriptBlock
  2. Объект класса [System.Text.RegularExpressions.MatchEvaluator]
  3. Пользовательский класс с статическим методом

ScriptBlock, каждое совпадение по шаблону сохраняется в переменной $_ или $psitem.

$_.GetType().FullName — System.Text.RegularExpressions.Match

PS > "A1B2C3" -replace "\d", {[int]$_[0].Value*2}
A2B4C6

PS > "A1B2C3" -replace "\d", {$psitem[0].Value*3}
A111B222C333


PS > $_[0]


Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 5
Length   : 1
Value    : 3

PS > $_[0].Value
3
  



MatchEvaluator, каждое совпадение по шаблону сохраняется в переменной $args или param($var).



PS > $matchEvaluator = {[int]$args[0].Value*2} -as [System.Text.RegularExpressions.MatchEvaluator]
PS > "A1B2C3" -replace "\d", $matchEvaluator
A2B4C6

PS > $matchEvaluator = [System.Text.RegularExpressions.MatchEvaluator]{param($m) [int]$m[0].Value*3}
PS > "A1B2C3" -replace "\d", $matchEvaluator
A3B6C9
  



Пользовательский класс с статическим методом, каждое совпадение по шаблону сохраняется в переменной MethodName([ObjectClass]$var).



PS >
class matchEvaluator {
    static [string] Replace([System.Text.RegularExpressions.Match]$m) {
	return [int]$m[0].Value*3
    }
}

"A1B2C3" -replace "\d", [matchEvaluator]::Replace

A3B6C9
  

В PowerShell Desktop evaluator можно использовать через [regex]::Replace.

PS >  [regex]::Replace("A1B2C3","\d",{[int]$args[0].Value*2})
A2B4C6
PS >  [regex]::Replace("A1B2C3","\d",{param($m) [int]$m[0].Value*3})
A3B6C9
  

Для массива строк мы можем использовать аналогичные действия:

PS > "1abc","2qwe","3rty" -replace "\d"
abc
qwe
rty

  

PS > "1abc","2qwe","3rty" -replace "\d","X"

Xabc

Xqwe

Xrty

PS > "1abc","2qwe","3rty" -replace "\d",{[int]$_[0].Value*2}
2abc
4qwe
6rty
  

Подстановки в регулярных выражениях подробно описано на docs.microsoft.com,я лишь приведу примеры использования.

* Для экранирования символа подстановки $ используйте ` (backtick) – "`$" если используются двойные кавычки

   ‘$’ – не требуется экранирования

   "`$" – экранирование

   ("Abc`$1" + ‘$1’ + "Xyz") – комбинирование



# $number The text matched by group number number.
# $0 - весь шаблон
# $1 - первая группа
# $2 - вторая группа 

PS > "111-2222" -replace "(\d{3})-(\d{4})",'($1) : $2'
(111) : 2222

PS > "111-2222" -replace "(\d{3})-(\d{4})","(`$1) : `$2"
(111) : 2222

PS > "111-2222" -replace "(\d{3})-(\d{4})","'`$`$1 - `$1' : `$`$2 - '`$2'"
'$1 - 111' : $2'2222'

PS > "String" -replace "(.+)ing",("Abc" + '$1' + "Xyz")
AbcStrXyz

# ${name} The text matched by group named name.

PS > "Dog name" -replace "^(?<dog>.{3}).+",'${dog} pop'
Dog pop

# $$ A literal $.
  

PS > "1234" -replace "\d",'$$'
$$$$

#$& A copy of the entire match.
  

PS > "Moscow" -replace "^.*$",'Capital: $&'
Capital: Moscow

#$` The text of the input string that precedes the match.
  

PS > "PreText" -replace "Text$",'$`'
PrePre

#$' The text of the input string that follows the match.
  

PS > "PreText" -replace "Pre",'$'''
TextText

#$+ The last group captured.
  

PS > "PreText" -replace "(.+)Text",'$+Now'
PreNow

#$_ The entire input string.
  

PS > "String" -replace "(.*)ing",'Entire String: $_'
Entire String: String
  
Реклама

Read Full Post »