2011年11月23日水曜日

◆正規表現の基礎<文字クラス>

これまで正規表現については必要になった都度に適当に調べて適当に使っていた。
.NETではあまり文字列を扱うようなプログラムを組む機会が多くなかった。
しかし、Powershellを使うようになってから何かと必要に迫られることが多くなってきたので、ここはひとつ基本的な所は勉強してみようと思い立った。Powershellは後発の為かあまり正規表現について詳しく解説しているサイトが見当たらない。仕方がないので他の言語で説明しているサイトを参考にしながら地道に試していこうと思う。
まずは文字クラスから。

<文字クラス>


.(ピリオド)


改行文字(\n)以外の任意の一文字。(ただし [] 内ではピリオド文字。)
「.」
「」内に任意の1文字がある箇所にマッチ

PS>"Powershell" -match "Power.hell"
True
PS>"Powershell" -match "Power..hell"
False
PS>"Powershellよ" -match "Power.hell"
True
PS>"" -match ".*"
True
PS>" " -match "."
True
PS>"A.A" -match "A\.A"
True

*は直前文字の0回以上の繰り返しなので空文字にもマッチしてしまう。
ピリオド自体を表すには直前に¥をつけてエスケープする。
 


[characters]

[ ] 内の任意の文字。

PS>"abc" –match '[cde]'
True
PS>"abc" –match '[def]'
False

 


[^characters]

[ ] 内の任意の文字以外の文字。

PS>"abc" -match '[^cab]'
False
PS>"abcd" -match '[^cab]'
True

 


[開始文字-終了文字]

開始文字から終了文字の範囲内にある文字。複数のセットを繋げて指定もできる。

PS>"c" -match '[a-d]'
True
PS>"c" -match '[c-d]'
True
PS>"c" -match '[d-z]'
False
PS>"C" -match '[c-d]'
True
PS>"f" -match '[c-de-g]'
True

 


[^開始文字-終了文字]

開始文字から終了文字の範囲外にある文字。

PS>"abc" -match '[^cab]'
False
PS>"abcd" -match '[^cab]'
True

 


\p{文字クラス}

文字クラスにはUNICODEに対して付けられているカテゴリー名、もしくはグループ名を指定する。
カテゴリー名とグループ名については以下のMicrosoftのサイト(の下の方)に記載されている。

文字クラス

実際にマッチする文字は、カテゴリブロックを参照。

ちなみに、「Lu」は大文字のキャラクタと説明があるのだが、Powershell(というか.NET?)では小文字もマッチするようだ。
image

PS>"a" -match '\p{Lu}'
True
PS>"aA(カ山" -match '\p{IsHiragana}'
False
PS>"あ" -match '\p{IsHiragana}'
True

<補足・訂正>
おもいっきり間違っていました。
大文字小文字を区別する場合は-matchではなく-cmatchを使うとのご指摘を頂きました。(cが付く演算子は幾つかあるが、matchにcが付くのは知りませんでした。というかHELPには載っていないような・・・)

ということでサンプルを修正しました。

PS>"a" -cmatch '\p{Lu}'
False
PS>"A" -cmatch '\p{Lu}'
True
PS>"あア亜" -match '\p{IsHiragana}';$matches[0]
True

PS>"あア亜" -match '\p{IsKatakana}';$matches[0]
True

PS>"あア亜" -match '\p{IsCJKUnifiedIdeographs}';$matches[0]
True

 


\P{文字クラス}

\p{文字クラス}の否定形。


\w

任意のワード文字。
ワード文字とは英数字とアンダーバーを指し、[a-zA-Z_0-9]と同義。

PS>"()=~|{`@}*+?" -match '\w'
False
PS>"a" -match '\w'
True
PS>"A" -match '\w'
True
PS>"_" -match '\w'
True


\W

非ワード文字。


\s

空白文字。
空白文字とは、タブ、スペース(全角含む)、改行
(厳密にはまだあるみたいだが、普通に使うのはこんなところ?)

PS>" " -match '\s'
True
PS>"`t" -match '\s'
True
PS>"`r" -match '\s'
True
PS>"`n" -match '\s'
True
PS>" " -match '\s'
True
PS>"A" -match '\s'
False
PS>"aあア([\9" -match '\s'
False


\S

空白文字以外。


\d

0から9までの数字(全角を含む)

PS>@(0..9;65296..65305 | %{[char]$_};"A","B") | %{"`n対象文字 match"}{Write-Host $_ `t ($_ -match '\d')}

image


\D

数字以外。

2 件のコメント:

  1. 文字クラスの「Lu」は正しく機能するんですが、-match演算子は「大文字小文字を区別しない」(IgnoreCase=true)のでそういう結果になります。
    -cmatch演算子を使えば意図通りの動作になるかと思います。

    .NET正規表現の文字クラスといえばIsCJKUnifiedIdeographs(「漢字」を表す)が好きです^^

    返信削除
  2. うわ、初っ端からおもいっきり間違っていましたね(^^;
    そもそも、こういうサンプルを書く時に-cmatchではなく-matchを使うこと自体お間抜けですよね。

    いつもありがとうございます。
    サンプルを修正しておきます。(「漢字」も追加しておきます)

    返信削除