PowerShell 正規表現

先頭と終端にマッチさせる

次のようなヒア文字列$strに対し、始めと終わりの文字にマッチさせる正規表現の挙動を確認する。

$str = @"
1
2
3
"@

「全体の」先頭と終端

正規表現において、全体の先頭は^、全体の終端は$で表される。

$strに対し、次のように ^. で検索すると1にマッチする。(.は任意の1文字)

[regex]::Matches($str, '^.')

ここで注意すべきことは、各行の先頭ではなく全体の先頭という点だ。

次に、終端を意味する$を使用して下のように記載すると、3にマッチする。

[regex]::Matches($str, '.$')

こちらも、全体の終端だ。

「各行の」先頭と終端

各行の先頭と終端を取得するには、次のようにMultilineオプションを指定する。

[regex]::Matches($str, '^.', "Multiline")
[regex]::Matches($str, '.$', "Multiline")

上記のいずれも、1,2,3すべてにマッチする。つまり各行の先頭と終端にマッチする。

Multilineオプションを無視して全体の先頭と終端を取得

正規表現\A,\Zを使用すると、Multilineオプションを無視して全体の先頭と終端を取得することができる。

[regex]::Matches($str, '\A.', "Multiline")
結果:1

[regex]::Matches($str, '.\z', "Multiline")
結果:3

この方法は、たとえば関数の中にMultilineオプションを含む正規表現を記載し、引数として正規表現パターンを指定する場合に便利だ。

関数の中に記載したMultilineオプションはそのままで、引数である正規表現パターンにて^を\Aに,$を\Zに変えるだけで、一時的にMultilineオプションを無視させるような使い方ができる。

注意点

ここで紹介した^,\A,$,\Zは、いずれも位置にマッチするという点に注意が必要となる。

特に、Multilineオプション指定時の$は改行そのものにマッチしそうにみえるが、実際は改行直前の「位置」にマッチする。

そのため、たとえば次のようにすると、各行の終端にaddという文字列が追加され、改行はそのまま、という結果が返される。

$str = @"
1
2
3
"@

[regex]::Replace($str, '$', 'add', "Multiline")

実行結果:

1add
2add
3add
プロフィール

興味のあること、つまづいたこと、考えたことなどを書いています。

カテゴリー

コメント

タイトルとURLをコピーしました