サーチ…


構文

  • 'テキスト' - 'RegExPattern'と一致
  • 'text' -replace 'RegExPattern'、 'newvalue'
  • [正規表現] ::マッチ( "text"、 "pattern")#単一マッチ
  • [正規表現] ::一致( "text"、 "pattern")#複数の一致
  • [regex] :: Replace( "text"、 "pattern"、 "newvalue")
  • [regex] :: Replace( "text"、 "pattern"、{param($ m)})#MatchEvaluator
  • [regex] :: Escape( "input")#特殊文字をエスケープする

シングルマッチ

Regexを使用してテキストに特定のパターンが含まれているかどうかを素早く判断できます。 PowerShellでRegexを使用するには複数の方法があります。

#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を返しtrue 。一致した場合は、 $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

選択文字列の使用

PowerShell 2.0では、正規表現を使用してテキストを検索するための新しいコマンドレットが導入されました。一致を含むtextinputごとに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()を使う

また、.NET [RegEx]クラスで使用可能な静的なMatch()メソッドを使用することもできます。

> [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演算子を使用する

PowerShellの-replace演算子を使用すると、 'input' -replace 'pattern', 'newvalue'の構文を使用して、パターンに一致するテキストを新しい値に置き換えることができます。

> $text -replace $pattern, $newvalue
This is test sample
text, this is
a test

[RegEx] :: Replace()メソッドを使用する

一致のReplace()は、 [RegEx] .NETクラスのReplace()メソッドを使用して行うこともできます。

[regex]::Replace($text, $pattern, 'test')
This is test sample
text, this is
a test

MatchEvalutorを使用してテキストを動的値に置き換えます

パターンに一致する値を、その特定の一致に基づく新しい値に置き換える必要があり、新しい値を予測できなくなることがあります。このようなシナリオでは、 MatchEvaluatorが非常に便利です。

PowerShellでは、 MatchEvaluatorは、現在の一致のMatchオブジェクトを含む単一のパラメータを持つMatchEvaluatorと同じくらい簡単です。アクションの出力は、その特定のマッチの新しい値になります。 MatchEvalutor[Regex]::Replace()静的メソッドで使用できます。

:inside ()内のテキストを長さに置き換える

#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)

特殊文字をエスケープする

正規表現パターンは、多くの特殊文字を使用してパターンを記述します。例。、 . 「任意の文字」を意味し、 +は「1つ以上」などを意味する。

これらの文字を使用するには、a .+など、パターンで、あなたは特別な意味を削除するためにそれらをエスケープする必要があります。これは正規表現でバックスラッシュ\であるエスケープ文字を使って行います。例: +を検索するには、 \+パターンを使用します。

正規表現内のすべての特殊文字を覚えておくことは難しいので、検索したい文字列内のすべての特殊文字をエスケープするには、 [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スイッチを追加することにより、すべての一致(グローバル一致)を見つけることができます。

> $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]クラスのMatches()メソッドを使用して、複数の一致をグローバルに検索することもできます。

> [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