正規表現講座 .Net Framework版

はじめに
正規表現は、実装言語により若干の差異があります。
本稿では、.Net FrameworkのSystem.Text.RegularExpression.Regexの正規表現を対象とします。
他の正規表現の場合、使えるもの・使えないものに微妙な差があります。
例題では、Powershellを使う想定です。
わかりやすさのために、一部不正確な表現になっているところはご容赦願います。
正規表現の基本
正規表現とは、文字列を照合するための表現です。
固定の文字列であるかを判定する場合、==等の言語固有の演算子で判定が可能ですが、「abc」「abd」のいずれかの判定となると、OR等を使用して複数条件を書くことになります。
条件が二個であればORでつないでも良いですが、もっと多い、例えば「abで始まる3文字以上を含む文字列か?」といった条件となると、面倒です。
これを解消するのが、正規表現となります。
まずは、やってみましょう。
Windows付属のPowershellでは、「-match」演算子で簡単に正規表現による一致が確認できます。
Powershellを起動し、以下の一行目のように「’abc’ -match ‘ab.’」と入力すると
> ‘abc’ -match ‘ab.’True |
「True」とかえってきます。
これは、「abc」という文字列は正規表現「ab.」にマッチするか?という評価で、「True」すなわちマッチする、ということを表します。
基本パターン
リテラル
文字そのものです。
大雑把に言えば、半角記号以外の文字と考えてください。
例えば、正規表現の「a」は「a」という文字にマッチしますが「b」にはマッチしません。
> ‘a’ -match ‘a’True > ‘b’ -match ‘a’ False |
任意の一文字
「.」(ピリオド)は、LF(ASCIIコード10、Windowsの改行CRLFの後半)を除く一文字にマッチします。
たいていの文字にマッチする記号として覚えてください。
> ‘a’ -match ‘.’True > ‘b’ -match ‘.’ True > “`n” -match ‘.’ False |
Powershellの場合、LFは「”`n”」とすることで表現できます。
LF
「\n」は、LF(ASCIIコード10、Windowsの改行CRLFの後半)にマッチします。
> “`n” -match ‘\n’True > ‘a’ -match ‘\n’ False |
正規表現のリテラル表記としては、LFを「\n」として表現します。
文字グループ
「[abc]」は、「a」「b」「c」のいずれかにマッチします。
> ‘b’ -match ‘[abc]’True > ‘d’ -match ‘[abc]’ False |
また、「[a-z]」が「a」~「z」にマッチするように、範囲指定も可能です。
> ‘b’ -match ‘[b-x]’True > ‘a’ -match ‘[b-x]’ False |
グループ化
「(abc|wxyz)」は、「abc」か「wxyz」にマッチします。括弧を使うとパターンをグループ化することができます。
> ‘abc’ -match ‘(abc|wxyz)’True > ‘abw’ -match ‘(abc|wxyz)’ False |
量指定
「a*」は、任意個の「a」にマッチします。「a」「aa」「aaa」…、加えて長さ0の文字列にもマッチします。
「*」は任意個の直前のパターンにマッチする正規表現です。
> ‘a’ -match ‘a*’True > ‘aa’ -match ‘a*’ True > ” -match ‘a*’ True |
「a?」は、0または1個の「a」にマッチします。「a」と長さ0の文字列にマッチします。
「?」は0または1個の直前のパターンにマッチする正規表現です。
> ‘a’ -match ‘a?’True > ” -match ‘a?’ True |
アンカー
「^」は、先頭にマッチします。「^a」で「a」から始まる文字列にマッチします。
> ‘a’ -match ‘^a’True > ‘ba’ -match ‘^a’ False > ‘ba’ -match ‘a’ True |
「$」は、末尾にマッチします。「a$」で「a」で終わる文字列にマッチします。
> ‘a’ -match ‘a$’True > ‘ab’ -match ‘a$’ False > ‘b’ -match ‘a$’ False |
例題
・「WindowsXP」「WindowsVista」「Windows7」「Windows8」にマッチして「Windows9」にマッチしない正規表現は?
・偶数にマッチし奇数にマッチしない正規表現は?(マッチ対象は1つの数値とします。例「12345」「23456」等)
つづく・・・
1 thoughts on “正規表現講座 .Net Framework版”
この投稿はコメントできません。