Поиск…


Синтаксис

  • '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)
2,0

Использование 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)


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow