C#の正規表現(1)

正規表現は、ある種の文字列を表現する。

正規表現 正規表現があらわすもの
[a-z] a,b,c,...,zまでの1文字
\d{3} 3桁の数字

「マッチする」の意味

ある正規表現 r が表現する全体の文字の集合を S(r)としよう。このとき、文字列 w が集合 S(r) の要素になっているとき、 「文字列 w は正規表現 r にマッチする」あるいは「正規表現 r は文字列 w にマッチする」という。

注:意味することは同じにもかかわらず、「文字列w」も「正規表現r」もマッチの主語になる。

例.

「文字aは正規表現[a-z]にマッチする」といえるが、これはまた「正規表現[a-z]は文字aにマッチする」とも言い換えられる。

正規表現の応用例

stringクラスを利用するよりも一般に高度な文字列の抽出や置換が可能。

例. メールアドレスや郵便番号などの特徴あるデータの取得.
例. 入力データが適切かどうかを判定.
例. テキストデータを他のアプリケーションが利用できる形に整形する。

メタ文字とリテラル

正規表現において、特殊な意味を持った1文字を「メタ文字」といい、その「文字」そのままの意味で解釈されるものをリテラルという。 例. 正規表現 [a-z] は「aからzまでの1文字」という意味であるが、ここで「角カッコ」と「ハイフン」はメタ文字である。 注. 状況によって、メタ文字となっていたものがリテラルとなるときもある。

正規表現の基本

  • 連結
  • 選択 (or)
  • 繰り返し(0個以上の繰り返し)
  • 繰り返し(1個以上の繰り返し)
  • グループ化

連結

正規表現は、通常の文字の検索方法と同じように、文字をそのまま検索できる。
例. 「April」はそのまま「April」という文字列にマッチする。
つまり、連結をあらわす特別な記号は必要ない。

選択

縦棒 | は、or を意味する。
例. march|apple は「march」or「apple」にマッチ。

繰り返し(0個以上の繰り返し)

アスタリスク * を用いる。
例. a* は、長さ0の文字を ε と表記すれば ε , a, aa ,aaa, … にマッチする。

繰り返し(1個以上の繰り返し)

プラス + を用いる。
例. a+ は、a, aa ,aaa, … にマッチする。

グループ化

まとめたいものを丸カッコで囲む。
例. abc|d は「abc」or「d」にマッチ。 ab(c|d) は「abc」or「abd」にマッチ。

角カッコ [ ]

角カッコで表現された正規表現は、ある種の文字の1文字を表す。

例. 次の3つの正規表現はすべて、「0から5までの1文字」を表現する。

[0-5]
[012345]
0|1|2|3|4|5

注:1文字だから、[0-5]は、文字列「123」全体にマッチしない

角カッコの中のメタ文字

どの文字がメタ文字となるかは、角カッコの「中」と「外」では異なる。特に次の4つの記号には注意。

角カッコの中のメタ文字候補
\ - ^ [ ]
候補だから、必ずメタ文字となるわけではない。通常の文字として扱いたければ、\記号を付加する。
メタ文字 メタ文字ではない
[a-z]のハイフン [-a-z]の最初のハイフン
[^a]のキャレット [a^]のキャレット
キャレットは角カッコの最初にある時だけ特別な意味を持つ。

1文字を表現する正規表現

正規表現 マッチする文字
. (ドット) ラインフィード(\n)以外の任意の1文字。
\w 単語に用いられる1文字。 アルファベット,ひらがな, 漢字など。アンダーバーや数字も含む。
\d 数字1文字. [0-9]との違いは全角数字も含む点。
\u数値 数値で指定されたUnicodeで 表現される1文字. 4桁まで対応。
\s 空白や改行1文字.
\p{IsHiragana} ひらがな1文字
\p{IsKatakana} カタカナ1文字