サーチ…
構文
- 'テキスト' - '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)
選択文字列の使用
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)