Chapter 10

おわりに

j5c8k6m8
j5c8k6m8
2021.06.14に更新
  • 否定演算は受理状態を反転させる事で実現
  • NFAを経由しない「純DFAエンジン」

という2つの発想で、論理演算可能な正規表現が簡単に実装できました。

本書の執筆の動機は、 論理演算可能な正規表現は実現できるのか? という疑問の答えが見つからなかったことです。
本書を通して、同じような疑問を持っている方に対する答えとなり、論理演算可能な正規表現の可能性が伝われば、本書の目的は達成されました。

それでは、 何故、今まで論理演算可能な正規表現に関する議論が活発に行われなかったのでしょうか?

その答えは筆者は持ち合わせてはいません。 [1]
論理演算可能な正規表現に関する議論や実装が行われていない訳ではありません。
論理積と否定の演算については、先読みと否定先読みを使えば既存の正規表現でも可能 です。
しかし、先読みや否定先読みについては、直接、論理演算を示す規則ではありません。
そのため、筆者の様に、正規表現は論理演算ができるのか?といった疑問を抱く人も多いでしょう。
つまり、 正規表現で論理演算が可能であることは、分かりやすい形で知られていない といえるでしょう。

正規表現自体が文字列の集合を表わす用途以外に使われている ことも、一因でしょう。筆者は、 文字列の集合を示すために正規表現を使う場合は、正規表現のアンカーを使わず、本書のような論理積や否定を用いる方が、分かりやすく実用に即している と考えています。(細かいですが、文字列の集合として用いる場合は、ワイルドカード * も 0文字以上に任意文字 としての記号の方が分かりやすいと考えています。)

正規表現自体は、文字列の集合を表わす非常に優れた方法だと考えています。プログラミング言語の型システムに対する注目が高まっている今、正規表現が論理演算可能という事が広まり、より多くのアイディアに繋がれば幸いです。

最後に、本書の随所で引用を使用させていただいてますが、本書の執筆において、正規表現についての理解を深める際に、以下の記事の内容に大変助けられました。

正規表現エンジンを作ろう - CodeZine

以下の記事が無ければ、本書の執筆は出来なかったと思います。著者の hiratara 様ならびに関係者様に心から感謝申し上げます。

脚注
  1. @keen さんから以下の意見を頂き、修正しました。
    https://zenn.dev/j5c8k6m8/scraps/6d8b5816d0f4ee#comment-50371cb2ef06f1 ↩︎