正規表現 Version 1 系統

ここでは当社(多摩ソフトウエア有限会社)の製品で使用される正規表現の仕様について説明します。正規表現の仕様は、世界的におおよその標準があり、当社の正規表現もこれに準拠しています。

ただし、一部に当社独自の拡張仕様がありますので、それらの構文は [独自仕様] とマークしてあります。これにより、大文字/小文字を区別しない検索、全角/半角を区別しない検索、タグを無視した検索など、高度な正規検索を行うことができます。

このページの表記規約

*? 緑の文字は、正規表現を表します。
n 斜体は、実際には何か別のテキストが入ることを表します。

※注意: この文書では円記号(\)がバックスラッシュ(\)で表示される場合がありますが、この 2 つは同じものです。

正規表現の例

あか 「あか」にマッチする。
あ[かお] 「あか」または「あお」にマッチする。
あか|あお 「あか」または「あお」にマッチする。
あか?い 「あかい」または「あい」にマッチする。
<[^>]*> 「<」から「>」までの範囲にマッチする。
.(.)\1 「バナナ」「CNN」など、末尾 2 文字が同じである 3 文字にマッチする。

表現一覧

正規表現 説明
. 任意の 1 文字。「a」、「あ」、「!」、改行、空白などにマッチする。全角文字も 1 文字と数える。
? 直前の表現の 0〜1 回の繰り返し({0,1} と同じ)。a? は「a」または空文字列にマッチし、.? は任意の 1 文字または空文字列にマッチする。
* 直前の表現の 0 回以上の繰り返し({0,} と同じ)。a* は空文字列、「a」、「aa」、「aaaaaa」などにマッチし、.* は長さ 0 以上の任意の文字列にマッチする。
+ 直前の表現の 1 回以上の繰り返し({1,} と同じ)。あ+ は「あ」、「あああ」などにマッチし、[aあ]+ は「あ」、「aあ」、「aaあa」などにマッチする。
[chars] chars 内のいずれかの文字にマッチする。たとえば [abあ] は「a」、「b」、「あ」のいずれかにマッチする。「-」で範囲を指定することもできる。たとえば [あ-お] はあ行の文字にマッチし、[A-Za-z_] は半角アルファベットまたは「_」にマッチする。範囲は Shift-JIS の文字コードで決まる。chars 部分では、] - \ だけが特殊文字として扱われる。
[^chars] chars 内に含まれない 1 文字にマッチする。[^紅白] は「紅」、「白」以外の文字にマッチし、[^か-こカ-コ] はか行およびカ行以外の文字にマッチする。chars 部分では、] - \ だけが特殊文字として扱われる。
^ 比較先テキストの先頭でのみマッチする。
$ 比較先テキストの末尾でのみマッチする。
{m,n} 直前の表現のmn 回の繰り返し(mn は任意の正数または 0)。たとえば a{2,3} は「aa」または「aaa」にマッチする。
{m,} 直前の表現のm 回以上の繰り返し。たとえば a{2,} は a の 2 個以上の連続にマッチする。
{m} 直前の表現のm 回の繰り返し。たとえば a{2} は「aa」にマッチする。
?? ?消極型
*? * の消極型。たとえば「<b>太字</b>」に適用した場合、積極型の <.*> は「<b>太字</b>」全体にマッチするが、消極型の <.*?> は「<b>」にマッチする。積極型で「<b>」だけにマッチさせるには、<[^>]*> とする必要がある。
+? + の消極型。
{m,n}? {m,n} の消極型。
{m,}? {m,} の消極型。
{m}? {m} の消極型。
| 左右のどちらかの表現がマッチすれば成功。たとえば ab|cde は「ab」または「cde」にマッチする。
(exp) expを 1 つにグループ化し、かつ \n で後方参照できるように記憶する。最初の ( ) の内容は \1、次の ( ) の内容は \2 で参照でき、\9 まで同様。
たとえば ab+ は「abbb」にマッチし、(ab)+ は「abab」にマッチする。(.)\1 は「aa」や「bb」にマッチし、「ab」にはマッチしない。「abc」に (.+) をマッチさせると、「abc」が \1 に入り、(.)+ をマッチさせると、最後の繰り返しで得られた「c」が \1 に入る。
\n これ以前に (exp) にマッチした文字列が入る。n は 1 〜 9 で、最初の ( ) の内容が \1 に、次の ( ) の内容ガ \2 に入り、9 番目が \9 に入る。10 番目以降は {:nn} 形式 (たとえば {:10}) で参照できる。入れ子の ( ) もそれぞれ個別に記憶され、番号は「(」が出現した順序で決まる。たとえば (.)\1 は連続する同一文字にマッチする
(?:exp) (exp) と似ているが、記憶しないでグループ化のみ行う。
(exp){=name} (exp) と似ているが、この記憶に名前 name を付け、{:name} で参照できるように記憶する。通常の \n による参照も可。[独自仕様]
{:name} これ以前に ( ) にマッチした文字列が入る。name には (exp){=name} で定義した name か、または数値を指定する。name には A〜Z、a-z、0 〜 9、_ を使用できる(ただし先頭が数字であってはならない)。大文字と小文字は区別される。[独自仕様]
{@directive} 各種の指令。有効範囲は、この指令の場所から現在の ( )、(?...)、(*...) の末尾まで。以下のいずれかを指定する。[独自仕様]

{@c} 大文字と小文字を区別する (既定)。
{@ic} 大文字と小文字を区別しない。全角の英字、ロシア文字、ギリシア文字の大文字と小文字も区別しなくなる。
{@z} 全角文字と半角文字を区別する (既定)。
{@iz} 全角文字と半角文字を区別しない。具体的には、A〜Z、a〜z、0〜9、カタカナ、空白文字( )、および記号(#$%&|^〜+−*/=;:¥@_‘’”()[]{}<>「」!?,.、。・ー)の全角と半角を同一視する。注意:(?<=...) および (?<!...) 内では、このオプションは無視される。
{@ign(exp)} exp を無視して検索。たとえば「{@ign(<[^<>*>)}ABC」とすると、<...> 形式のタグを無視して「ABC」を検索できる。

(?=exp) 前方静止チェック。ここから右側が exp に一致すると成功する。
(?!exp) 前方静止チェック。ここから右側が exp に一致しないと成功する。
(?<=exp) 後方静止チェック。ここから左側が exp に一致すると成功する。
(?<!exp) 後方静止チェック。ここから左側が exp に一致しないと成功する。たとえば (<!自動)車 は「自動車」以外の「車」にマッチする。
(*=exp) 後方静止チェック。(?<=exp) と同じ。[独自仕様]
(*!exp) 後方静止チェック。(?<!exp) と同じ。[独自仕様]
(?>exp) この内部ではバックトラックしない。たとえば a?a は「a」にも「aa」にもマッチするが、(?>a?)a(?>a?a) は「aa」にしかマッチしない。
(?#text) コメント。無視される。
(?tops) 比較先テキストの先頭でのみマッチする。^ と同じ。[独自仕様]
(?ends) 比較先テキストの末尾でのみマッチする。$ と同じ。[独自仕様]
(?topl) 行頭でマッチする。[独自仕様]
(?endl) 行末でマッチする。[独自仕様]
(?cx:exp) exp に一致しないような場所にある 1 文字にマッチする。(?:(?!exp).) と同じ。[独自仕様]
\b 英単語境界(単語構成文字と非単語構成文字との間)にマッチする静止チェック。単語構成文字とは英数字と「_」のことで、[A-Za-z0-9_] と同じ。
\B \b が成立しないすべての場所にマッチする静止チェック。
\c \C が成立しないすべての場所にマッチする静止チェック。[独自仕様]
\C 単語内部にマッチする静止チェック。単語構成文字、半角カナ、全角漢字、全角ひらがな、全角カタカナ、全角英数字およびアンダーバー、全角ギリシア文字、および全角ロシア文字を区別し、これらの文字種が連続する箇所にマッチする。[独自仕様]
\d 数字 1 文字にマッチする。[0-9] と同じ。
\D \d 以外の任意の 1 文字にマッチする。
\p 英単語内以外(単語構成文字 [A-Za-z0-9_] の間以外)にマッチする静止チェック。[独自仕様]
\P \p が成立しないすべての場所(英単語内)にマッチする静止チェック。[独自仕様]
\s 空白文字 1 文字にマッチする。[ \f\x0A\r\t\v] と同じ。
\S \s 以外の任意の 1 文字にマッチする。
\w 任意の単語構成文字 1 文字にマッチする。単語構成文字とは英数字と「_」のことで、[A-Za-z0-9_] と同じ。
\W \w 以外の任意の 1 文字にマッチする。
\a \e \f \n \r \t \v \xnn \\ 「エスケープ表記」を参照
\ss は記号) 記号 s 自体を表すエスケープ表記。たとえば \+ は「+」文字を表す。
その他の文字 その文字自身にマッチする。

優先順位(結合力)

1(強) かっこで囲まれた範囲、および OR 表現 | 以外のすべての特殊文字列とそのターゲットとの間
2 通常文字同士の間
3(弱) | とそのターゲットとの間

例:

正規表現 解釈
abc* ab(c*)
a(bc)* a((bc)*)
abc|de (abc)|(de)
a(bc|d)e a((bc)|d)e

エスケープしないと特殊な意味を持つ文字

通常 . ? * + { [ ^ $ | ( ) \
[ ] または [^ ] 内 - ] \
置換文字列内 \

備考: 表現 \s は、s が記号(英数字以外)の場合、それが特殊な意味を持つ文字であるかどうかにかかわりなく、常に s 自体を表す。したがって、記号が特殊な意味を持つかどうか迷った場合は、\ でエスケープしておけば間違いない。

静止チェック

通常、ある表現がマッチすると比較先テキストのテスト位置が進むが、^ $ (?=exp) (?!exp) (?<=exp) (?<!exp) \b \B \c \C \p \P の各表現は、テスト位置に影響を与えない。

たとえば「abc」に ab を適用すると、まず先頭の a が「a」にマッチして、テスト位置が進み、次の b が「b」と比較されてマッチが成功する。これに対して、(?=a)b を適用した場合は、先頭の (?=a) が「a」にマッチし、しかしテスト位置は変化せず、次の b も再び「a」と比較されてマッチは失敗する。この (?=a)b はいかなる表現ともマッチしない。

(?<!黄)緑 は「黄緑」以外の「緑」にマッチする。この表現は [^黄]緑 に似ているが、後者は比較先テキストの先頭にある「緑」にはマッチしない。

[ - ] と文字コード

[a-b] には文字コードが a から b までの文字が該当します。文字コードは Shift-JIS とユニコードによって異なるため、たとえば「すべての漢字」を指定するための [a-b] は、Shift-JIS とユニコードで異なります。

次に例を示します。

目的の文字群Shift-JIS での記述例ユニコードでの記述例
すべての英文字[A-Za-z][A-Za-z]
すべての数字[0-9][0-9]
すべての漢字[亜-K][\u4E00-\u9FFF\x3005] または [一-龠々]
すべてのひらがな[ぁ-んー][\u3040-\u309Fー] または [ぁ-んー]
すべてのカタカナ[ァ-ヶー][\u30A0-\u30FF] または [ァ-ヾ]
すべての半角カタカナ[。-゚][。-゚]

お使いのアプリケーションが Shift-JIS ベースかユニコード ベースかによって、どちらを使用するかを選択してください。

他の正規表現システムての互換性

当社独自の拡張仕様は、上の表で [独自仕様] とマークしてあります。また、次の仕様は他のシステムでは異なる場合があります。

正規表現当社の正規表現システム多くの他のシステム
. 改行文字にもヒットする 改行文字にはヒットしない
^ ファイル(ストリーム)先頭にヒットする 行頭にヒットする
$ ファイル(ストリーム)末尾にヒットする 行末にヒットする

バックトラック

? * + | などを含む表現は、単一のテキストに対して複数のマッチが可能になる場合がある。たとえば a+ を「aaa」に適用すると、この表現は「aaa」、「aa」、「a」の 3 とおりの範囲にマッチできる。

このような場合、? * + {m,n} {m,} {m}積極型)は、できるだけ長い範囲にマッチしようとし(最長一致)、?? *? +? {m,n}? {m,}? {m}?消極型)は、できるだけ短い範囲にマッチしようとする(最短一致)。OR 表現 | は、単純に左のパラメータを優先する。たとえば「aaa」に適用した場合、a+ は「aaa」にマッチし、a+? は「a」にマッチし、aa|aaa|a は「aa」にマッチする。

ただし、複数の選択肢を持つこれらの表現は、全体のマッチを成功させるために必要な場合は 2 番目以下の候補ともマッチできる。たとえば「aabab」に適用した場合、[ab]+b は「aabab」にマッチし、[ab]+?b は「aab」にマッチする。(a|aa|aaba)b では、(OR 表現の 3 番目のパラメータも有効だが)2 番目のパラメータが優先されて「aab」にマッチする。

このように後続のために最善のマッチ範囲を変更することをバックトラックという。たとえば「aaa」に a*aa を適用した場合、先頭にある積極型の a* は、まず「aaa」全体とマッチする。しかしこれでは後続の aa がマッチできないため、バックトラックし(やり直し)て「aa」にマッチする。これでも足りないため、もう 1 回バックトラックして「a」にマッチし、ついに a*aa 全体のマッチが成功する。

補足

制限

置換

置換文字列では、次の文字列が特殊な意味を持ちます。

表現 説明
\0 検索文字列ヒットした範囲全体に置き換わる。
\n 検索文字列中の \n と同じで、検索文字列中の n 番目の ( ) にマッチした文字列が入る。たとえば \1 は最初の ( ) にヒットした文字列に置き換わる。10 番目以降は \{nn} 形式 (たとえば \{10}) で記述する。
\{name} 検索文字列中の {:name} と同じで、検索文字列中の ( ) にマッチした文字列が入る。name には (exp){=name} で定義した name か、または数値を指定する。name が 1 桁の数値の場合は上の \n と同等 (たとえば \{1}\1 と同等)。[独自仕様]
\a \e \f \n \r \t \v \xnn いずれも検索文字列中の同一表記と同じ意味。上記参照。
\\ 「\」文字を表すエスケープ表記。
\ss は記号) 記号 s 自体を表すエスケープ表記。

V1.35 Last updated at   Tama Software Ltd.