列正規表現、バッグ正規表現、集合正規表現を区別できるような記法(構文) を提案する。
通常の正規表現は、列(シーケンス、リスト)言語を定める正規表現である。 しかし、項目(item, member)の順序を問題にしない場合もあり、そのときは、列言 語よりもバッグ(マルチセット)言語がふさわしい。さらに、重複出現があり 得ないときは集合(セット)言語が適切となる。
列言語に対して正規表現(通常の正規表現)があるのと同様に、バッグ言語、 集合言語に対する正規表現も定義できる。これら3種の正規表現に同じ記法を 使ってもよいのだが、混乱のおそれがある。正規表現の種類(列/バッグ/集 合)をすぐさま区別できるような記法があれば便利だろう。
この記事では、そのような記法(構文)を提案する。
通常の正規表現で使われている演算子記号(結合子、メタ文字)は次のもの である。
記号 | 意味 |
---|---|
「,」または並置 | 連接 |
「|」 | 選択、どちらか一方 |
「?」 | オプショナル、なくてもいい |
「*」 | 任意回の繰り返し |
「+」 | 1回以上の繰り返し |
バッグ正規表現、集合(セット)正規表現では、「,」に代えて「&」を使う ことにする。「&」は、バッグまたは集合の合併(ユニオン)を意味する。 AとBがバッグ(または集合)言語のとき、A & B の意味は次のように定義される。
「,」の代わりに「&」を使う以外は、通常の正規表現と同じ演算子記号を使 う。ただし、集合正規表現のときは「+」は意味がなく(a+ = aだから)、「*」 と「?」は同じ意味である。よって、標準的に「?」だけを使うことにする。
記号 | 列正規表現 | バッグ正規表現 | 集合正規表現 |
---|---|---|---|
「,」または並置 | ○ | - | - |
「&」 | - | ○ | ○ |
「|」 | ○ | ○ | ○ |
「?」 | ○ | ○ | ○ |
「*」 | ○ | ○ | - |
「+」 | ○ | ○ | - |
正規表現の種別(列/バッグ/集合)を区別するために、次のルールを設ける。
例えば次のようになる。
正規表現の種別(列/バッグ/集合)判定は、一番外側の括弧で行うので、 内部の括弧は丸括弧でよい。
別案として、一番外側にキーワードを付けることが考えられる。例えば:
正規表現はKleene代数により解釈されるべきものだが、表現自体には解釈の 場や方法の指定は含まれない。種別を指定した正規表現は、(ある程度は)解 釈(意味論)に対する指示を含んでいる。つまり、列正規表現が 一般のKleene代数で解釈されるのに対して、バッグ正規表現は可換Kleene代数、 集合正規表現は乗法が可換かつベキ等であるKleene代数で解釈される。