ここでは当社(多摩ソフトウエア有限会社)の製品で使用される正規表現の仕様について説明します。正規表現の仕様は、世界的におおよその標準があり、当社の正規表現もこれに準拠しています。
ただし、一部に当社独自の拡張仕様がありますので、それらの構文は [独自仕様] とマークしてあります。これにより、大文字/小文字を区別しない検索、全角/半角を区別しない検索、タグを無視した検索など、高度な正規検索を行うことができます。
*? | 緑の文字は、正規表現を表します。 |
n | 斜体は、実際には何か別のテキストが入ることを表します。 |
※注意: この文書では円記号(\)がバックスラッシュ(\)で表示される場合がありますが、この 2 つは同じものです。
あか | 「あか」にマッチする。 |
あ[かお] | 「あか」または「あお」にマッチする。 |
あか|あお | 「あか」または「あお」にマッチする。 |
あか?い | 「あかい」または「あい」にマッチする。 |
<[^>]*> | 「<」から「>」までの範囲にマッチする。 |
.(.)\1 | 「バナナ」「CNN」など、末尾 2 文字が同じである 3 文字にマッチする。 |
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 | いずれも検索文字列中の同一表記と同じ意味。上記参照。 |
\\ | 「\」文字を表すエスケープ表記。 |
\s (s は記号) | 記号 s 自体を表すエスケープ表記。 |
V1.35 Last updated at Tama Software Ltd.