正規検索

検索パターン

 検索パターンは、いわゆる「正規表現」風に記述する。 「正規表現」は、万能の表現ではなく、 また、記述の文法、機能自体も処理系(というより、処理プログラム)によって大きく異なる。 従って、ここで指定するのは、このプログラム群独自の記述方法である。

表記文字

以下に示すメタ文字・エスケープ文字・制御文字以外は、そのままで文字そのものを表わす。

メタ文字

特殊な機能や意味を持った文字。 指定した位置以外では通常の文字として扱われるものもある。

^検索パターンの先頭にある場合は行の先頭を表す。 クラス指定の先頭にある場合は否定集合を示す。
$ 検索パターンの最後にある場合は行末を表す。
. 任意の1文字との一致を表す。
* 直前の単純要素の0個以上の一致を表す。
+ 直前の単純要素の1個以上の一致を表す。
? 直前の単純要素の0または、1個の一致を表す。
[ クラス指定の始まり。
] クラス指定の終わり。
- クラス指定の中のコードのつなぎ。
\( 部分文字列指定の始まり。
\) 部分文字列指定の終わり。
\{ 繰り返し指定の始まり。
\} 繰り返し指定の終わり。
\< 文字列ブロックの始まり。
\> 文字列ブロックの終わり。
\1-\9 部分文字列を表す。
\= 部分文字列記述の始まり
\! 最小一致探索に切替える。
\/ 現在位置をマークする。
\d 組み込みクラス。数字1文字と一致。[0-9]と同じ
\D 組み込みクラス。数字以外1文字と一致。[^0-9]と同じ
\s 組み込みクラス。空白相当文字と一致
\S 組み込みクラス。空白相当文字以外と一致
\w 組み込みクラス。英数字と_に一致。[_0-9A-Za-z]と同じ
\c 組み込みクラス。制御文字と一致。
\C 組み込みクラス。制御文字と不一致。
\g 組み込みクラス。半角文字と一致。
\G 組み込みクラス。半角文字と不一致。
\k 組み込みクラス。全角文字と一致。
\K 組み込みクラス。全角文字と不一致。
\l 境界判定。左右のどちらかが英数字
\L 境界判定。左右の双方が英数字か、双方とも英数字でない

エスケープ文字

エスケープ文字は、メタ文字にあたる文字自身や制御文字を表すために使用する。 エスケープ記号の後の文字は大文字と小文字を区別する。

\a 制御文字 BELL(07h)
\b 制御文字 BS(08h)
\e 制御文字 ESC(1Bh)
\f 制御文字 FF(0Ch)
\n 制御文字 LF(0Ah)
\r 制御文字 CR(0Dh)
\t 制御文字 TAB(09h)
\v 制御文字 HM(0Bh)
\\\」自身
\..」自身
\**」自身
\++」自身
\??」自身
\[[」自身
\]]」自身
\--」自身
\^^」自身
\$$」自身
\hnn 16進数で表した1バイトコード
\xnnnn 16進数で表した漢字コード(JISコード)。 旧版との互換性のために有る。 \Xの使用を推奨したい。
\Xnnnn 16進数で表した内部コード

制御文字(00h - 1Fh)

パターン中にかかれた制御コードは無視しする。

検索パターンの構造

書式

[^] 要素の並び [$]
要素を並べて、その前後を行頭指定(^)または、行末指定($)で挟むことができる。 行頭指定、行末指定は当然、省略することもできる。

行頭指定

パターンの先頭に「^」を書くことで指定する。
この指定があると、必ず、行頭からの一致を調べる。 例えば、
^main
と指定すると、「main」で始まる行を捜す。

行末指定

パターンの最後に「$「を書くことで指定する。
この指定があると、必ず、行末で終わるパターンを検索する。 例えば、
です。$
と指定すると、「です。」で終わる行を捜す。 また、
^start$
と指定すると、厳密に「start」だけでできている行を捜す。 さらに、
^$
と指定すると、空行つまり、内容の入っていない行を捜し出す。

要素

要素は単純要素、複合要素、特殊要素からなる。

単純要素

c 文字 文字そのもの。
メタ文字以外の文字はそのまま、文字自身を表わす。 メタ文字でも、場所によってはその文字自身を表すこともある (たとえば、行末以外の「$」;など)。
. 任意の1文字 ピリオドは任意の1文字と一致する。 例えば、
a.b
は、「axb」や「azb」や「a缶b」などに一致し、 「ab」とは一致しない。
[...] クラス指定

[...]の中に書かれた文字範囲に一致する1文字を表す。 文字範囲は文字そのものを書いたり、 <->でつないでコードの範囲で指定したりできる。

[A-Z]半角の英字大文字
[ABC]「A」、「B」、「C」のどれか1文字
[A-Za-z0-9_]半角の英数字と「_」
また、先頭に「^」をつけると、文字範囲に含まれない文字を表わす。
[^A-Z]半角の英字大文字以外
[ABC]「A」、「B」、「C」以外の1文字
クラス指定の[..]の中では、 メタ文字の「$」、「.」、「*」、「+」、「?」、「[」はメタ文字の機能を失って、 その文字自身を表す(もちろん、\$などの指定も可能)。 [..]の先頭では、「]」や「-」はそのままの意味を表す。 さらに、[..]の先頭以外では「^」はそのままの意味を持つ。
[a-b]のような適切な使われかたをしなかった場合の「-」、 例えば、[a-b-c]の2番目の「-」は「-」それ自身を表す。 「\」を書きたい場合は残念ながら、「\\」と書くしかありません。
\s \S \d \D \w \W \c \C \g \G \k \K
組み込みクラス

よく使うクラス指定はメタ文字で指定できる。

\s[ \f\n\r\t\v] 空白文字一文字
\S[^ \f\n\r\t\v]空白文字以外一文字
\d[0-9] 数字一文字
\D[^0-9] 数字以外一文字
\w[_0-9A-Za-z] 英数字一文字
\W[^_0-9A-Za-z] 英数字以外一文字
\c制御文字一文字
\C制御文字以外一文字
\g半角一文字
\G半角以外一文字
\k全角一文字
\K全角以外一文字
\1-\9
\=nn;
部分文字列 検索対象の中で、メタ文字「\(」と「\)」の間で一致した部分は部分文字列として、 番号を1からふって99まで、記憶される。 これらのうち最初の9つは、「\1」、「\2」、、「\9」で引用できる。
10番目以降では、\=の後に数字で番号を書き、 最後に;をつけて引用する。
\=nn;
 部分文字列の引用は、該当する部分文字列の指定の後でなければならない。 また、部分文字列の指定自体は入れ子にして指定できる。
\(.\)\1
は、同一の2文字の連続パターンを表す。 このように、部分文字列として記憶されるのは、 検索対象の文字列自身だということに留意すること。
\<...\> 文字列ブロック 検索対象の中で、 メタ文字「\<」と「\>」に挟まれた部分は、 ひとまとめの文字列として扱い、直値の文字並びのみが許される。 複合要素として後ろに修飾しない限り、単純に直値で書いたものと差異はない。 複合要素として使用する場合にのみ意味がある。
\<^...\> 否定文字列 文字列ブロックの中の先頭に「^」をつけると、以降の文字列と一致しないことを検定する。 この要素は、複合要素として修飾することはできない。 次ぎの要素に対して否定的な限定を与える働きをする。
現在のテキストポインタから後ろに指定の文字列が無いことを検定し、 テキストポインタは進まない。 この結果、単独で用いると、無限ループに陥る。 必ず、(長さの確定する)他の要素と併用する。
\<^abc\>.+
は、一致文字列の先頭に「abc」が無いことを保証する。 「abcdef」は「bcdef」の部分が一致することに留意。
^\<^abc\>.+
とすれば、「abcdef」は一致しない。
^\<^abc\>\<^def\>.+
は、「abcxyz」「defxyz」は一致しない。 これは、この要素ではテキストポインタが進まないことを利用した例である。
\l 単語境界 現在位置の左右のいずれかが単語(英数字、_)である境界位置。 ポインタは進まない。
\L 非単語境界 現在位置の左右の双方が単語(英数字、_)、あるいは、単語でない。 ポインタは進まない。
単号の境界でないことを示す。

複合要素

部分文字列指定

書式 \( 要素の並び \)

上記で述べた、<\1>などで引用できる。例えば、入れ子にして
\(abc\(def\)\2\)@\1
のように書ける。この場合、\2は、内側の括弧の内容
def
となり、\1は、外側の括弧の内容(abcdef\2を結合して)
abcdefdef
となる。この結果、
abcdefdef@abcdefdef
と同等になる。

繰り返し指定

単純要素(文字、「.」、クラス指定、「\1」..「\9」、文字列ブロック)の後ろに以下の記号をつけることで、 繰り返しを表すことができる。 通常は、繰り返しが複数一致する場合に、最も長く一致するものから順に検定するが、 *+\{\}のあとに、 \!を付けると、もっとも短く一致するものから順に検定をする。

* 0回以上の繰り返し 直前の要素の0回以上の繰り返し。長い方から検定する。
例えば、
ab*c
は、「ac」、「abc」、「abbbbbc」などと一致する。
a.*c
は、「.」が任意の文字なので、 「ac」、「axc」、「aasabc」などと一致する。
文字列「abcabcd」に対して検定すると、長い方から一致を見るので、 「abcabc」を最初に検定する。
*\! 0回以上の繰り返し 直前の要素の0回以上の繰り返し。短い方から検定する。
a.*\!c
を文字列「abcabcd」に対して検定すると、短い方から一致を見るので、 「abc」を最初に検定する。
+ 1回以上の繰り返し 直前の要素の1回以上の繰り返し。長い方から検定する。
ab+c
は、「abc」、「abbbbc」などと一致する。 「*」指定と異なり、「ac」とは一致しない。
+\! 1回以上の繰り返し 直前の要素の1回以上の繰り返し。短い方から検定する。
? 0、1回の一致 通常は、「直前の要素の0または、1回の繰り返し」となっている。
歴史的な経緯で、ホストプログラム側から「バウンダリモード」を指定すると、 「1回または、行頭、行末との一致」という機能になる。
現在は、後述のように、クラス文字と\!\!\!を 組み合わせることでこの機能を実現できるので、バウンダリモードを使用する 必要はなくなった。
理解のため、バウンダリモードの例をあげる。
[^A-Za-z]?main[^A-Za-z]?
「main」を捜し出しす。 このとき、mainがほかの英字に含まれている場合を除外することができる。 バウンダリモードでは、行頭や行末にある「main」も正しく見つける。
\{[^]n,m\} 指定回数の繰り返し 直前の要素の指定回数の繰り返し。長い方から検定する。
nは最小の回数(0以上)、mは最大の回数を指定する。 nはmよりも大きくないように指定する。 (念のため、内部処理では、 n、mの大きな方を最大回数、小さな方を最小回数として扱っているが、 これに頼るべきではない。)
nを省略するとm以下の回数、mを省略するとn以上の回数の指定となる。
xa\{1,3\}
は、「xa」「xaa」「xaaa」と一致する。 「xaaaa」は、「xaaa」の部分が一致する。

通常は、指定回数以上の連続に対して、先頭から指定回数分だけ取り出すが、 ^を先頭に付加すると、指定回数の連続のみを取り出す。 つまり、指定回数より長い一致に対しては不一致となる。
xa\{^1,3\}
は、「xa」「xaa」「xaaa」と一致するが、 「xaaaa」では一致する部分が無くなる。
\{[^]n,m\}\! 指定回数の繰り返し 直前の要素の指定回数の繰り返し。短い方から検定する
xa\{1,3\}\!
は、「xa」と一致する。 「xaa」「xaaa」、「xaaaa」は、「xa」の部分が一致する。
a\{1,3\}\!x
は、「ax」、「aax」「aaax」と一致する。 「aaaax」は、「aaax」の部分が一致する。 これは奇妙に見えるが、テキストポインタが2番目の「a」に進んだ時点で、 検索式の一致があるからである(最小回数から検定して長いものに、たどり着いた)。

xa\{^1,3\}\!
は、「xa」と一致する。 「xaa」、「xaaa」は「xa」の部分が一致する。
「xaaaa」は一致しない。
a\{^1,3\}\!x
は、「ax」、「aax」「aaax」と一致する。 「aaaax」は、「aaax」の部分が一致する。 (これも、テキストポインタが2番目の「a」に進んだ時点での一致である)

特殊な指定

クラス文字に対して特殊な指定機能がある。

\! 現在位置のクラス不一致 現在位置に指定のクラス文字がない。 現在位置が行末であれば、常に成立する。
ポインタは進まない。
例えば、
main[a-zA-Z0-9]\!
と指定すれば、「main」の後ろは英数字ではないことが確定する。 かつ、一致文字は「main」であることに留意したい.
\!\! 直前位置のクラス不一致 現在の一文字前にクラス文字がない。 現在位置が行頭であれば常に成立する。
ポインタは進まない。
例えば、
[a-zA-Z0-9]\!\!main
と指定すれば、「main」の直前の文字は英数字ではないことが確定する。 かつ、一致文字は「main」である。
さらに、
[a-zA-Z0-9]\!\!main[a-zA-Z0-9]\!
と指定すれば、「main」の前後に英数字がないことを保証する。 かつ、一致文字は「main」である。
\!* 直前直後のクラス不一致 現在位置または、現在位置のひとつ前のどちらかにクラス文字がある
ポインタは進まない。
\!+ 直前位置のクラス一致 現在位置または、現在位置のひとつ前の双方にクラス文字があるか、   あるいは、双方にクラス文字がない
ポインタは進まない。

文字列ブロックにのみ許される特殊な指定が有る

\! 現在位置の文字列一致 本来の一致と異なり、テキストのポインタは進まない。 通常は、一番最後に記述し、切り出し領域の確定に使用する。
使用方法を誤ると無限ループに陥る可能性が高い。
.+\<xyz\>\!
「abcdef」は一致しない。「abcxyz」は「abc」の部分が一致する。 このとき、「abcxyz」が一致するわけではない。

特殊要素

検索内容に関わりの無い、特殊な要素がある。

\/ 現在位置 一致文字列中の現在位置をアプリケーションに知らせる。
文字列ブロックや、クラス指定の中には書けない。 出現順に1から99までの番号が振られる。
アプリケーションにより機能が違うが、特定文字列の取り出し等に用いる。 CXTRA.EXEでは、再検索の開始位置を指定するために使用出来る。