PowerShell
Регулярные выражения
Поиск…
Синтаксис
- 'text' -match 'RegExPattern'
- 'text' -replace 'RegExPattern', 'newvalue'
- [regex] :: Матч («текст», «шаблон») # Совместный матч
- [regex] :: Матчи ("текст", "шаблон") # Количество совпадений
- [Регулярное выражение] :: Заменить ( "текст", "образец", "NewValue")
- [regex] :: Replace («текст», «шаблон», {param ($ m)}) #MatchEvaluator
- [regex] :: Escape ("input") # Специальные символы Escape
Единый матч
Вы можете быстро определить, содержит ли текст определенный шаблон с использованием Regex. Существует несколько способов работы с Regex в PowerShell.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
Использование оператора -Match
Чтобы определить, соответствует ли строка шаблону с помощью встроенного -matches
оператора, используйте синтаксис 'input' -match 'pattern'
. Это вернет true
или false
зависимости от результата поиска. Если было совпадение, вы можете просмотреть совпадение и группы (если они определены в шаблоне), обратившись к $Matches
-variable.
> $text -match $pattern
True
> $Matches
Name Value
---- -----
0 (a)
Вы также можете использовать -match
для фильтрации через массив строк и только возвращать строки, содержащие совпадение.
> $textarray = @"
This is (a) sample
text, this is
a (sample text)
"@ -split "`n"
> $textarray -match $pattern
This is (a) sample
a (sample text)
Использование Select-String
PowerShell 2.0 представил новый командлет для поиска по тексту с помощью регулярного выражения. Он возвращает объект MatchInfo
каждого текстового ввода, который содержит совпадение. Вы можете получить доступ к его свойствам, чтобы найти соответствующие группы и т. Д.
> $m = Select-String -InputObject $text -Pattern $pattern
> $m
This is (a) sample
text, this is
a (sample text)
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
Подобно -match
, Select-String
также может использоваться для фильтрации через массив строк путем соединения массива с ним. Он создает MatchInfo
-объект для каждой строки, которая содержит совпадение.
> $textarray | Select-String -Pattern $pattern
This is (a) sample
a (sample text)
#You can also access the matches, groups etc.
> $textarray | Select-String -Pattern $pattern | fl *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
IgnoreCase : True
LineNumber : 3
Line : a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(sample text)}
Select-String
также может выполнять поиск с использованием обычного текстового шаблона (без регулярного выражения), добавляя переключатель -SimpleMatch
.
Использование [RegEx] :: Match ()
Вы также можете использовать метод static Match()
доступный в классе .NET [RegEx]
.
> [regex]::Match($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
> [regex]::Match($text,$pattern) | Select-Object -ExpandProperty Value
(a)
замещать
Общей задачей для регулярного выражения является замена текста, соответствующего шаблону с новым значением.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Text wrapped in ()
$pattern = '\(.*?\)'
#Replace matches with:
$newvalue = 'test'
Использование оператора -Replace
Оператор -replace
в PowerShell может использоваться для замены текста, соответствующего шаблону, новым значением с использованием синтаксиса 'input' -replace 'pattern', 'newvalue'
.
> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test
Использование метода [RegEx] :: Replace ()
Замена совпадений также может быть выполнена с помощью метода Replace()
в классе [RegEx]
.NET.
[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test
Заменить текст динамическим значением с помощью MatchEvalutor
Иногда вам нужно заменить значение, соответствующее шаблону, новым значением, основанным на этом конкретном совпадении, что делает невозможным предсказать новое значение. Для этих типов сценариев MatchEvaluator
может быть очень полезен.
В PowerShell MatchEvaluator
так же прост, как скриптовый блок с одним параметром, который содержит объект Match
для текущего совпадения. Результатом действия будет новое значение для этого конкретного соответствия. MatchEvalutor
может использоваться с статическим методом [Regex]::Replace()
.
Пример : Замена текста внутри ()
его длиной
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '(?<=\().*?(?=\))'
$MatchEvalutor = {
param($match)
#Replace content with length of content
$match.Value.Length
}
Выход:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is 1 sample
text, this is
a 11
Пример: Сделайте sample
верхнем регистре
#Sample pattern: "Sample"
$pattern = 'sample'
$MatchEvalutor = {
param($match)
#Return match in upper-case
$match.Value.ToUpper()
}
Выход:
> [regex]::Replace($text, $pattern, $MatchEvalutor)
This is (a) SAMPLE
text, this is
a (SAMPLE text)
Escape специальные символы
Регулярный шаблон использует множество специальных символов для описания шаблона. Пример .
означает «любой символ», +
«один или несколько» и т. д.
Чтобы использовать эти символы, выполните следующие действия .
, +
и т. д., в шаблоне вам нужно избегать их, чтобы удалить их особое значение. Это делается с помощью escape-символа, который является обратным слэшем \
в регулярном выражении. Пример. Чтобы выполнить поиск +
, вы должны использовать шаблон \+
.
Трудно запомнить все специальные символы в регулярном выражении, поэтому, чтобы избежать каждого специального символа в строке, которую вы хотите найти, вы можете использовать метод [RegEx]::Escape("input")
.
> [regex]::Escape("(foo)")
\(foo\)
> [regex]::Escape("1+1.2=2.2")
1\+1\.2=2\.2
Несколько совпадений
Существует несколько способов найти все совпадения для шаблона в тексте.
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
Использование Select-String
Вы можете найти все совпадения (глобальное соответствие), добавив переключатель -AllMatches
в Select-String
.
> $m = Select-String -InputObject $text -Pattern $pattern -AllMatches
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a), (sample text)}
#List all matches
> $m.Matches
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
Groups : {(sample text)}
Success : True
Captures : {(sample text)}
Index : 37
Length : 13
Value : (sample text)
#Get matched text
> $m.Matches | Select-Object -ExpandProperty Value
(a)
(sample text)
Использование [RegEx] :: Матчи ()
Метод Matches()
в .NET `[regex] -class также может использоваться для глобального поиска нескольких совпадений.
> [regex]::Matches($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
Groups : {(sample text)}
Success : True
Captures : {(sample text)}
Index : 37
Length : 13
Value : (sample text)
> [regex]::Matches($text,$pattern) | Select-Object -ExpandProperty Value
(a)
(sample text)