PowerShell: 正規表現で一致文字列を複数抽出する Matches

PowerShellで正規表現を使って複数の一致文字列を抽出したい場合、 RegExクラスのMatchesメソッドを使用します。 RegExは.NET Frameworkのクラスであり、 Matchesメソッドはスタティックメソッドです。

書式
[regex]::Matches(検索文字列, パターン文字列 [,検索オプション])

RegExクラスは正式には「System.Text.RegularExpressions.RegEx」と記述します。 ですがエイリアスとして「regex」が定義されているので[regex]と記述する方が 短くて済みます。
戻り値はMatchオブジェクトのコレクションです。 マッチしない場合は空文字が戻ります。

次のサンプルコードはMatchesメソッドの使用例です。

$s = "cat bat hat dat but"

$m = [regex]::Matches($s, "b.t")

$m

「$m」はMatchオブジェクトのコレクションなので、 次のようにいろいろな値が表示されます。 マッチした個数を知りたい場合はCountプロパティを指定します。

実行結果
Groups    : {0} 
Success   : True
Name      : 0
Captures  : {0}
Index     : 4
Length    : 3
Value     : bat
ValueSpan : 

Groups    : {0}
Success   : True
Name      : 0
Captures  : {0}
Index     : 16
Length    : 3
Value     : but
ValueSpan :

ほとんどの場合、取得したいのは太字で表示されている値(Value)のみだと思います。 Valueのみを取得する場合は「$m.Value」と記述します。

$s = "cat bat hat dat but"

$m = [regex]::Matches($s, "b.t")

$m.Value

これで値のみを取得できます。

実行結果
bat
but

インデックスを使って単一の値を指定する場合は角括弧[]を使って記述します。

$m[0].Value  # bat
$m[1].Value  # but

マッチしない場合は空文字

パターン文字列にマッチしない場合は空文字が戻ります。

$s = "cat bat hat dat but"

$m = [regex]::Matches($s, "a.t")

$m      # $mは空文字なので何も表示されません。

[string]::IsNullOrEmpty($m)  # True
PowerShell