マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

正規表現とは、

正規表現(regular expression)

用途

正規表現のパターン マッチを使用すれば、例えば、次のような処理に利用可能である。

  1. 文字列の「特徴」(パターン)に一致するか検証する。
    • 用途:入力チェックなどに使用可能
    • API:Regex.IsMatch?() メソッドを使用する(型.Parse( ) メソッドの強化版)。
  2. 文字列の「特徴」(パターン)に一致する部分文字列を抜き出す。
    • 用途:全文検索処理などに使用可能
    • API:Regex.Matchs() メソッドを使用する(String.IndexOf?( ) メソッドの強化版)。
  3. 文字列の「特徴」(パターン)に一致する部分文字列を置換する。
    • 用途:置換(付加、削除、書式変更など)に使用可能
    • API:Regex.Replace() メソッドを使用する(String.Replace( ) メソッドの強化版)。
  4. 文字列の「特徴」(パターン)に一致する文字列で文字列分割する。
    • 用途:文字列分割処理に使用可能
    • API:Regex.Split() メソッドを使用する(String.Split( ) メソッドの強化版)。
  5. .etc

ライブラリ

現在では、Perl、PHP、Java、JavaScript、.NET、Python、Rubyなど、
広く様々なランタイムに実装されており、テキスト エディタ、ワード プロセッサをはじめとする、
アプリケーション ソフトの検索・置換機能などで利用することもできるようになっている。

方言

ただし、ソフトウェアによって「方言」や利用できない機能があるため、注意が必要である。

正規表現の書き方

正規表現は、

組み合わせて表記される。

正規表現の書き方を習得するには、これらの要素を覚える必要がある。

メタ文字

特別な意味を持った記号。

区分

動作

一覧

以下が、.NET Frameworkの正規表現で使用できるメタ文字。

項番区分メタ文字説明 / 注釈
1位置指定子「 ^ 」、「 $ 」の両方を指定することで全文のマッチを強制できる。
エスケープ文字に含まれる位置指定子もある。
1-1^文字列の先頭を表す(中間からのマッチを拒否)
※ 正規表現、部分式の先頭のものしかメタ文字として認識されない。
1-2$文字列の末尾を表す(中間からのマッチを拒否)
※正規表現、部分式の終端のものしかメタ文字として認識されない。
2代替構成体詳細はxxx節を参照
2-1「|」 で区切られた文字列のいずれか。
通常、下記、5-2の丸括弧と併用するが、単独で利用することも可能。
3量指定子正規表現での量指定子
http://msdn.microsoft.com/ja-jp/library/3206d374.aspx
3-1*前の文字列が 0 回以上連続にマッチする( = {0,})。
3-2+前の文字列が 1 回以上連続にマッチする( = {1,})。
3-3?前の文字列が 0 or 1 回マッチする( = {0,1})。
3-4{n}前の文字列がn回連続にマッチする。
3-5{n,}前の文字列がn回以上連続にマッチする。
3-6{n, m}前の文字列がn-m回連続にマッチする。
3-7*? ,etc.*、+、?、{ } の後に「 ? 」をつけて「最短マッチ」を表す。
4文字クラス正規表現での文字クラス
http://msdn.microsoft.com/ja-jp/library/20bw873z.aspx
4-1. (ピリオド)改行(\n)以外の任意の1文字
4-2[ ] (角括弧)下記、5-1に該当
4-3\sスペースやタブなどの空白文字
4-4\S\S以外([^\s]と同義)
4-5\d10進数([0-9]と同義)
4-6\D\d以外([^\d]と同義)
4-7\w単語に使用される任意の文字
([\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]と同義)
4-8\W\w以外([^\w]と同義)
5括弧
5-1[ ] 角括弧
詳細は「角括弧による文字グループ」を参照。
下記の角括弧内に指定した文字にマッチする。
・文字範囲(Unicodeの文字コード表)、
・文字グループ
以下は、角括弧内でのみ使われる特殊なメタ文字である。
・「 - 」:範囲指定 、例えば[a-z]で半角英小文字の文字グループを表す。
・「 ^ 」:先頭で使われたとき、「含まれない」と条件を反転する。
5-2( ) 丸括弧
詳細は「丸括弧による構成体」を参照
丸括弧内に指定した文字、文字範囲、文字グループに完全にマッチする。
グループ化構成体、代替構成体、その他の構成体を構成する。
日本語文字クラス(\p{xxxx}).NET TIPS 文字列のひらがな/カタカナをチェックするには? - C# - @IT
http://www.atmarkit.co.jp/fdotnet/dotnettips/054iskana/iskana.html
6-1\p{IsHiragana?}平仮名
6-2\p{IsKatakana?}片仮名
6-3\p{IsCJKUnifiedIdeographs?}漢字
6-4P{xxxx}p{xxxx}以外

エスケープ文字

エスケープ文字 には次のようなものがある。

項番区分文字のエスケープ説明 / 注釈
1位置指定子
1-1\bワードの境界(\w文字と\W文字の間)。
例えば「\bVB\b」で単語としての「VB」となる。
規定では日本語と英語の境界は「\b」に含まれない。
従って、「\bVB\b」という正規表現で、
「これは、VBです」という文字列中のVBを検索できない。
ただし、これについては、ECMAScriptオプションで動作を変更できる。
角括弧の中にある場合、置換パターンの場合は、下記、3-2を参照。
1-2\B\b以外
1-3\AMultiLine?オプションを無視した文字列の先頭
1-4\zMultiLine?オプションを無視した文字列の末尾
1-5\ZMultiLine?オプションを無視した文字列の末尾(または文字列の末尾の「\n」の前)
1-6\G前回の一致が終了した位置で一致する必要があることを指定する。
2メタ文字のエスケープ単純に、前に¥記号を付与する。
2-1\..
2-2\^^
2-3\$$
2-4\**
2-5\++
2-6\??
2-7\[[
2-8\]]
2-9\((
2-10\|
2-11\))
2-12\{{
2-13\}}
2-14\\\
3制御文字各種 制御文字を正規表現中の文字列で表す場合。
3-1\aベル(アラーム)の\u0007
3-2\b角括弧の中にある場合、置換パターンの場合は、\u0008
3-3\tタブの\u0009
3-4\rキャリッジ リターンの\u000D
3-5\v垂直タブの\u000B
3-6\fフォーム フィードの\u000C
3-7\n改行文字の\u000A
3-8\eエスケープ文字の\u001B
3-9\cCASCII 制御文字 と一致(\cC は Ctrl + C)
http://ja.wikipedia.org/wiki/ASCII#ASCII.E5.88.B6.E5.BE.A1.E6.96.87.E5.AD.97
4コードポイント各種 コードポイントを正規表現中の文字列で表す場合。
4-1\0408進数(3桁まで)で表されるASCII文字と一致
4-2\x2016進数(2桁)で表されるASCII文字と一致
4-3\u002016進数(4桁)で表されるUnicode文字と一致

角括弧による文字グループ

角括弧を使用した文字グループの定義には次のようなものがある。

※ 下記の、Chn(Ch1、Ch2、Ch3、Ch4など)は文字を表す。
xx_ChGroup?(Base_ChGroup?、Excluded_ChGroup?)は文字グループを表す。

文字の連結

[Ch1Ch2]

文字範囲(範囲指定)

[Ch1-Ch2]

文字範囲の連結

[Ch1-Ch2Ch3-Ch4]

文字グループ減算式

[Base_ChGroup?-[Excluded_ChGroup?]].etc

文字グループと文字クラスの減算式

丸括弧による構成体

丸括弧を使用した

について説明する。

グループ化構成体

項番区分グループ化構成説明
正規表現の例マッチする部分文字列
キャプチャ文字列
1グループ化
1-1(expression)グループ化する箇所(丸括弧内をキャプチャする)。
"大森(一郎|二郎) "大森一郎または 大森二郎 にマッチ
大森一郎、大森二郎以外に一郎、二郎が追加でキャプチャされる。
1-2(?:expression)グループ化する箇所(丸括弧内をキャプチャしない)。
"大森(?:一郎|二郎) "大森一郎または 大森二郎 にマッチ
大森一郎、大森二郎がキャプチャされ、一郎、二郎はキャプチャされない
1-3(?<name>expression)
※ < >は’でも良い。
グループ化する箇所(名前を付けて丸括弧内をキャプチャする)。
"大森(?<name>一郎|二郎) "大森一郎または 大森二郎 にマッチ
大森一郎、大森二郎以外に一郎、二郎が追加でキャプチャされる。
※ このキャプチャ文字列は、グループ名(name)を使用して参照できる。
1-4(?imnsx-imnsx: expression)指定したAPIオプションを部分式に適用(imnsxの部分)または無効(-imnsxの部分)にする。
正規表現のAPIオプション
https://msdn.microsoft.com/ja-jp/library/yd1hzczs.aspx
1-5(?<name1-name2>expression)グループ定義を均等化する。
1-6(?>expression)非バックトラッキング部分式。
2先読み・後読み(戻り読み)
2-1(?=expression)直後にこのパターンが現れることを確認する。
"\d+(?=%)"後ろに「%」が続く数字の連続にマッチ
「%」の部分はキャプチャされない。例えば100%で100がキャプチャされる。
2-2(?<=expression)直前にこのパターンが現れることを確認する。
"(?<=\\)\d+"「\」に続く数字の連続にマッチ。
「\」の部分はキャプチャされない。例えば\100で100がキャプチャされる。
2-3(?!expression)直後にこのパターンが現れないことを確認する。
"\d+(?![\d%])"後ろに「%」が続かない数字の連続にマッチ。
「%」の部分はキャプチャされない。例えば100KSで100がキャプチャされる。
2-4(?<!expression)直前にこのパターンが現れないことを確認する。
"(?<![\d\\])\d+"「\」に続かない数字の連続にマッチ。
「\」の部分はキャプチャされない。例えば$100で100がキャプチャされる。

代替構成体

項番区分代替構成体説明
正規表現の例マッチする部分文字列
キャプチャ文字列
1(?(expression1)expression2)expression1に一致した場合、そこからexpression2で検索
"(?(^大森).*郎(\\r?\\n|$))"大森一郎、大森二郎、大森三郎、などの行
先頭が「大森」の場合、末尾が「xxx郎」の行があれば、その行がキャプチャされる。
2(?(expression)yes_exp|no_exp)expressionに一致した場合、そこからyes_expで検索
一致しなかった場合、そこからno_expで検索
"(?(^大森).*郎(\\r?\\n|$)|^品川.*郎(\\r?\\n|$))"大森一郎、大森二郎、大森三郎、品川一郎、品川二郎、品川三郎、などの行
先頭が「大森」の場合、末尾が「xxx郎」の行があれば、その行がキャプチャされる。
また、先頭が「大森」でない場合、先頭「品川」 ~末尾「xxx郎」の行がキャプチャされる。
3(?(name)yes_exp|no_exp)割愛

その他の構成体

その他の構成体は、正規表現を変更する部分式(APIオプション、コメントなど)を表す。

項番その他の構成体説明
1(? imnsx - imnsx )パターンの途中でAPIオプションを適用(imnsxの部分)または無効(-imnsxの部分)にする。
2(?# )正規表現に挿入するインライン コメント。コメントは、最初の右かっこ文字で終了する。
3# [行末まで]X モード コメント。コメントは行末まで継続する。
このコメントを認識させるには、以下の何れかのAPIオプションを有効にする。
・xオプション
IgnorePatternWhitespace?オプション

キャプチャの利用

で参照(利用)できる。

ついて説明する。

前後方参照

前後方参照は、2つ連続する文字(文字グループ)のパターンを検索する場合などに使用する。

文字列置換

最長 / 最短マッチ

デフォルトでは「最長マッチ」となるため、必要に応じて「最短マッチ」を使用する。

最長マッチ

最短マッチ

パターン マッチの例

正規表現を使用したパターン マッチの例を示す。

メールアドレスを検索する

IgnoreCase?(大文字と小文字を区別しない)オプションを設定する必要がある。
※ 文章中から検索する場合は、前後に「\b」を付与する必要がある。
 また、日本語文章中の場合は、実行時、ECMAScriptオプションを設定する必要がある。
ハイライトの「\」は、リテラル中の「\」のエスケープ。

正規表現"[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}"
"([\\w-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([A-Z]{2,4}|[0-9]{1,3})(\\]?)"

HTML内のリンク先を検索する

※ 上記は、前方参照、最小マッチを併用している。
ハイライトの「\」は、リテラル中の「\」のエスケープと、
 C#に於ける「"」のエスケープ(VBの場合は「"」を使用)。

正規表現"href\\s*=\\s*(?:(?<quot>[\"'])(?<url>.*?)\\k<quot>)"
→「クォーテーション無し」を考慮していない例。
"href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))"
→「シングル クォーテーション」を考慮していない例。
	

HTML内の見出し、<H1>~<H6>タグを検索する

※ 上記は、前方参照、最小マッチを併用している。
※ 実行時、Singleline(「.」に、\nを含める)オプションを設定する必要がある。
ハイライトの「\」は、リテラル中の「\」のエスケープ。

正規表現"<(h[1-6])\\b[^>]*>(.*?)</\\1>"

HTML内のリンク、<a>タグから情報を抽出する

※ 上記は、前方参照、最小マッチを併用している。また、url、textなどの部分キャプチャを行なっている。
※ 実行時、IgnoreCase?(大 / 小文字を区別しない)、Singleline(「.」に、\nを含める)オプションを設定する必要がある。
ハイライトの「\」は、リテラル中の「\」のエスケープと、
 C#に於ける「"」のエスケープ(VBの場合は「"」を使用)。

正規表現"<a\\s+[^>]*href\\s*=\\s*(?:(?<quot>[\"'])(?<url>.*?)\\k<quot>|(?<url>[^\\s>]+))[^>]*>(?<text>.*?)</a>"

URL文字列から情報を抽出する

※ 最小マッチを使用している。また、プロトコル、ポート番号などの部分キャプチャを行なっている。
ハイライトの「\」は、リテラル中の「\」のエスケープ。

正規表現"^(?<proto>\\w+)://[^/]+?(?<port>:\\d+)?/"

利用するAPI、オプション

正規表現の処理に利用するAPIと、そのオプションについて説明する。

API

正規表現にて中心的役割を担うクラスにRegexクラスMatchクラスがある。

Regexクラス

Regexクラスは、正規表現パターンを格納し、パターン マッチングを実行するメソッドを備えたクラスである。
このオブジェクトからキャプチャ文字列の値を取り出して、引き続き、「手続き型の処理」を実装できる。

Matchクラス

Matchクラスは、Regexクラスで実行されたパターン マッチングの結果を格納するクラスである。

オプション

以下、Regexクラスのオプションについて説明する。
これによって一部、動作(処理結果)が変更される。

項番RegexOptions?列挙体のメンバ説明
1Noneオプションが何も設定されないことを指定する。
2ECMAScriptECMAScript準拠の動作とする。一部のメタ文字の意味が変更される。
・ECMAScript とします。 標準一致の動作
 http://msdn.microsoft.com/ja-jp/library/04ses44d.aspx
3Singlelineワイルドカードである.(ピリオド)の意味を、「\n」を含めたすべての文字の意味に変更する。
4Multiline「^」と「$」の意味を
・「^」:「文字列の先頭」 → 「行の先頭」
・「$」:「文字列の末尾」 → 「行の末尾」
に変更する。
「^」と「$」の代わりに「\A」と「\Z」を使用すると、
Multilineの影響を受けずに「文字列の先頭」、「文字列の末尾」を指定できる 。
5IgnoreCase?大文字と小文字を区別しない。
6CultureInvariant?言語(カルチャ)の違いを無視する。
RegularExpressions? 名前空間でのカルチャを認識しない操作の実行
 http://msdn.microsoft.com/ja-jp/library/z0sbec17.aspx
7RightToLeft?検索が左から右(→)ではなく右から左(←)に行われるように指定する。
8Compiled正規表現をコンパイルして実行速度を上げる。ただし、起動時間は長くなる。
・正規表現におけるコンパイルと再利用
 http://msdn.microsoft.com/ja-jp/library/8zbs0h2f.aspx
9ExplicitCapture?明示的に名前を指定されたグループだけが有効なキャプチャであることを指定する。
10IgnorePatternWhitespace?・正規表現のパターン内にコメント文を記述するには?[C#、VB] - @IT
 http://www.atmarkit.co.jp/fdotnet/dotnettips/582regexcomment/regexcomment.html

まとめ

正規表現により解決できる点

正規表現を使用すると、高度な、

などの処理を、高い生産性で実装することができる。

正規表現により解決できない点

ただし、以下の点は、正規表現により解決できない。

妥当性の検証が困難

表現できないケースがある

利便性と汎用的の両立は依然として困難

共通処理を、比較的容易に開発できる。

参考


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS