] > Regular Expression

第 11 回 正規表現、非決定性オートマトン

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

11-1. 正規文法

バッカス・ナウア記法において、指定できるルールを「非終端記号 → 終 端記号 非終端記号」だけに制限した文法を正規文法 といいます。 この文法で生成される言語の性質を調べます。

11-2. 正規表現

しかし、実際は次のように定義されるのが普通です。

  1. ε は正規表現です。
  2. アルファベット一文字は正規表現です。
  3. R と S が正規表現なら、 R | S, RS, {R} は正規表現です。

前回紹介した字句解析ソフト lex は、正規表現からそれを解釈する C 言語の プログラムを生成するプログラムです。 その他、Meadow(emacs) などの高機能エディタや perl などのスクリプト言語な どで、文字列を指定するのに正規表現が使えます。 これにより検索や置換を利用できます。 これらのソフトウェアで使われる正規表現は上の定義とは若干違い、おおむね 次のようになります(どのソフトウェアも細かい表現は微妙に違います)。

  1. . は任意の一文字を表す正規表現
  2. ^ は文字の最初、 $ は文字の最後を表す正規表現
  3. 英字、数字など特殊文字以外は正規表現
  4. \(バックスラッシュ、または円記号)とそれに続く文字(特殊文字を含む) は、その文字一文字を表す正規表現
  5. [ と ] に囲まれる文字の列は、それらの文字のうちのどれか一文字を表 す正規表現(但し、次項の形になる場合は除く)。 また A-Zで A から Z までのすべての文字を表します。
  6. [^ と ] に囲まれる文字の列は、それらの文字のどれにも含まれない文字 一文字を表す正規表現。 これも同様に A-Z の表現が使えます。
  7. R,S が正規表現の時、 RS は R の次に S が来ることを示す正規表現
  8. R,S,T が正規表現の時、(R|S|T) で R または S または T のどれかを示 す正規表現(emacs では \( と \) を使います)
  9. R が一文字を表す正規表現の時、R? で R が 0 回または 1 回を表す正規 表現、R* で R が 0 回以上の繰返しを表す正規表現、 R+ で R が 1 回以上 の繰返しを表す正規表現。 なお、 R が複数の文字を表す正規表現の場合も、 (R)?, (R)*, (R)+ で同様 の指定ができます

また、 MS-DOS プロンプトやコマンドプロンプトなどでも、ファイル名を指示 する時、不完全ながらも正規表現が使えます。

  1. 文字は正規表現
  2. 正規表現の連結は正規表現
  3. ? は任意の一文字、* は任意の文字列を表します。

但し、これは ab, abab などの表現を指定できないので、上で示した正規表現よりも 表現力が劣ってます。

演習11-1

次の正規表現が受理する言語(文字列の集合)を求めなさい。

  1. a*
  2. [abc]
  3. <[^>]*>
  4. [1-9][0-9]*

演習11-2

次の文字列を表す正規表現を示しなさい。

  1. 先頭が a で始まる文字列
  2. 最後が b で終る文字列
  3. c を含む文字列
  4. abc を含む文字列
  5. abc または def を含む文字列
  6. 先頭が英字、二文字目以降が英字、数字、または_(アンダースコア)であ る文字列(C 言語では名前はこのルールに従う必要がある)

演習11-3

コマンドプロンプトまたは MS-DOS プロンプトで c:\windows または c:\winnt ディレクトリの中のファイルのうち、次の条件に当てはまるファイ ル名を dir コマンドを使って表示しなさい。 但し、 Windows や MS-DOS はファイル名を二つの文字列を.(ピリオド)でつな がった形で表し、後ろの文字列を拡張子と言います。 例えば「拡張子が txt のファイル名」は dir *.txt で表示します。

  1. a で始まるファイル名
  2. 拡張子が exe のファイル名
  3. 前の部分のファイル名が d で終るファイル名

11-3. 非決定性オートマトン

オートマトンとは次のような有向グラフです。

  1. 開始ノードというノードが一つ指定される
  2. 終了ノードが一つ以上指定される
  3. 各辺には文字が一つずつ割り振られている。
オートマトン例

文字列に対して、開始ノードから一文字ずつたどって終了ノードにたどり着け た時、オートマトンはその文字列を受理すると言います。 一方、辺がなかったり、文字列が終った時に終了ノードではなかった時 拒否すると言います。 オートマトンにより、受理する文字列の集合が決定できます。受理する文字列 の集合をそのオートマトンが受理する言語と言います。

各ノードから出る辺に割り当てられている文字がすべて異なるオートマトンを 決定性オートマトンと言います。 このオートマトンは状態遷移図とも呼び、簡単にプログラムに変 換できます。

一方、各ノードから出る辺に割り当てられている文字にダブりがあったり、 ε(空文字)が割り当てられているオートマトンを非決定性オート マトン と言います。 ここでは非決定性オートマトンの受理する言語と正規文法で定められる言語が 一致することを示します。 具体的には正規文法から非決定 性オートマトンへの変換の仕方を示します。 (非決定性オートマトンから正規文法への変換方法は省略します)

非決定性オートマトン例

正規文法から非決定性オートマトンへ

帰納法により証明します。

ε を受理する非決定性オートマトンは次の通りである。
Case 1
文字 A を受理するオートマトンは次の通りである。
Case 2
R と S が正規表現であり、それを受理する非決定性オートマトンが存在 する時、R|S を受理する非決定性オートマトンは次の通りである。
Case 3
R と S が正規表現であり、それを受理する非決定性オートマトンが存在 する時、RS を受理する非決定性オートマトンは次の通りである。
Case 4
R が正規表現であり、それを受理する非決定性オートマトンが存在 する時、{R} を受理する非決定性オートマトンは次の通りである。
Case 5

演習11-4

次の正規表現を受理する非決定性オートマトンを作りなさい。

  1. a*
  2. [abc]
  3. (abc|asd)
  4. .*(a|b)?

坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科