2011年12月29日木曜日

◆正規表現の基礎<アトミックゼロ幅アサーション>

<アトミックゼロ幅アサーション>

なんか難しい言葉ですが、要はパターンがどのような場所で一致するかを表す指定のようです。


^

文字列の先頭。複数行オプションが有効の場合は行の先頭。

PS>"abc`ndef" -match '^ab'
True
PS>"abc`ndef" -match '^de'
False
PS>"abc`ndef" -match '(?m:^de)'
True


$

文字列の末尾。複数行オプションが有効の場合は行の末尾。

PS>"abc`ndef" -match 'ef$'
True
PS>"abc`ndef" -match 'bc$'
False
PS>"abc`ndef" -match '(?m:bc$)'
True


\A

文字列の先頭でマッチ。 

PS>"abc`ndef" -match '\Aab'
True
PS>"abc`ndef" -match '(?m:\Ade)'
False

 


\Z

文字列の末尾または末尾の改行の前でマッチ。

PS>"abc`ndef" -match 'ef\Z'
True
PS>"abc`ndef" -match '(?m:bc\Z)'
False

 


\z

文字列の末尾でマッチ。

PS>"abcde`n" -match 'de\Z'
True
PS>"abcde`n" -match 'de\z'
False
PS>"abcde" -match 'de\z'
True


\G

先頭から最後まで指定したパターンの連続を表す指定のようです。
マッチしない箇所が出てきたらそこで終わり。
「Match」クラスなどを使って連続してパターンを検索するのに使用する。
以下はMSDNに載っていたサンプルをPowerShellに変換したものです。

連続マッチのサンプル
  1. $str = "capybara,squirrel,chipmunk,porcupin,gopher," +
  2.          "beaver,groundhog,hamster,guinea pig,gerbil," +
  3.          "chinchilla,prairie dog,mouse,rat"
  4. $pattern = '(\G\w+\s?\w*),?'
  5. $match = [Regex]::Match($str, $pattern)
  6. while ($match.Success)
  7. {
  8.     $match.Groups[1].Value
  9.     $match = $match.NextMatch()
  10. }

0または1個のカンマで区切られたワード文字(間にスペースが1つ有っても良い)を検索するパターン。ループしてマッチするものをすべて見つける。
image

途中でマッチしない箇所があるとそこで終了します。

  1. $str = "capybara,squirrel,chipmunk,porcupin,-gopher," +

image

\Gの指定がないときはマッチしない箇所は飛ばして最後まで継続します。


\b

ワード境界でのマッチ。

PS>"Power-Shell(V2)" -match '\bShe'
True
PS>"Power-Shell(V2)" -match '\bhe'
False
PS>"Power-Shell(V2)" -match 'hell\b'
True
PS>"Power-Shell(V2)" -match '\bhell'
False


\B

ワード境界以外でのマッチ。

PS>"Power-Shell(V2)" -match '\BShe'
False
PS>"Power-Shell(V2)" -match '\Bhe'
True

0 件のコメント:

コメントを投稿