次のようなヒア文字列$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
コメント