各種正規表現の(仮)記法

檜山正幸 (HIYAMA Masayuki)
Thu Jun 16 2005:start

列正規表現、バッグ正規表現、集合正規表現を区別できるような記法(構文) を提案する。

目次

1. はじめに

通常の正規表現は、列(シーケンス、リスト)言語を定める正規表現である。 しかし、項目(item, member)の順序を問題にしない場合もあり、そのときは、列言 語よりもバッグ(マルチセット)言語がふさわしい。さらに、重複出現があり 得ないときは集合(セット)言語が適切となる。

列言語に対して正規表現(通常の正規表現)があるのと同様に、バッグ言語、 集合言語に対する正規表現も定義できる。これら3種の正規表現に同じ記法を 使ってもよいのだが、混乱のおそれがある。正規表現の種類(列/バッグ/集 合)をすぐさま区別できるような記法があれば便利だろう。

この記事では、そのような記法(構文)を提案する。

2. 演算子記号

通常の正規表現で使われている演算子記号(結合子、メタ文字)は次のもの である。

TABLE: 正規表現の演算子記号
記号 意味
「,」または並置 連接
「|」選択、どちらか一方
「?」オプショナル、なくてもいい
「*」任意回の繰り返し
「+」1回以上の繰り返し

バッグ正規表現、集合(セット)正規表現では、「,」に代えて「&」を使う ことにする。「&」は、バッグまたは集合の合併(ユニオン)を意味する。 AとBがバッグ(または集合)言語のとき、A & B の意味は次のように定義される。

もっと正確に言えば:

「,」の代わりに「&」を使う以外は、通常の正規表現と同じ演算子記号を使 う。ただし、集合正規表現のときは「+」は意味がなく(a+ = aだから)、「*」 と「?」は同じ意味である。よって、標準的に「?」だけを使うことにする。

TABLE: 演算子記号の使用/不使用
記号 列正規表現 バッグ正規表現 集合正規表現
「,」または並置 - -
「&」-
「|」
「?」
「*」-
「+」-

3. 種別を区別する

正規表現の種別(列/バッグ/集合)を区別するために、次のルールを設ける。

例えば次のようになる。

正規表現の種別(列/バッグ/集合)判定は、一番外側の括弧で行うので、 内部の括弧は丸括弧でよい。

別案として、一番外側にキーワードを付けることが考えられる。例えば:

キーワード方式なら、正規表現の種別がいくら増えて大丈夫だ。

4. 補足 OR 蛇足

正規表現はKleene代数により解釈されるべきものだが、表現自体には解釈の 場や方法の指定は含まれない。種別を指定した正規表現は、(ある程度は)解 釈(意味論)に対する指示を含んでいる。つまり、列正規表現が 一般のKleene代数で解釈されるのに対して、バッグ正規表現は可換Kleene代数、 集合正規表現は乗法が可換かつベキ等であるKleene代数で解釈される。