• Nova Expression

最近は、エディタの検索や置換でも正規表現(Regular Expression)が使えるのが当たり前になっている。正規表現は、便利な検索機能という見方もあるが、正規表現は「言語」で、ソフトウェア開発を大きく変えた技術の1つだ。

プログラムで文字列の処理などを行うとき、正規表現を使えるかどうかで効率が大きく違い、またソフトウェアの書き方も異なってくる。筆者がコンピュータを使い始めた1970年台、BASIC言語の文字列処理は、いまから考えるとひどく原始的なものだった。Excelの数式による文字列処理は、いまでも当時のままだ。もちろん便利な関数は増えたが考え方は同じ、Xは何文字目から始まるかを探す、文字列の前半、後半、中間部分を取り出す、文字列をつなげる、といった機能を使って文字列を処理していく。イメージ的には、テープの切り貼りみたいな感じの作業だ(わかるかなぁ)。固定したパターンの処理はなんとかなるが、たとえば「日付のように見える」部分を取り出すとなるとかなり面倒な処理になる。そうなると、日付は「YYYY/MM/DD」のパターンのみ対応、といった安易なプログラムになりがちだ。

正規表現は、UNIXとともにやってきた。1980年前半、日本国内でもバークレー版と呼ばれるBSD UNIXが利用可能になり、80年台後半に国産UNIXワークステーションが多数登場すると、正規表現を使ってファイルを検索する、あるいはエディタの検索置換条件の指定など、通常のコンピュータの操作で正規表現を普通に使えるようになった。

正規表現は、1950年台に数学的な記法として提案された。その論文をみると2つの正規表現EとFに対して「E∨F」、「EF」、「E*F」の3つの記法があるだけだ(参考文献1)。1968年にQEDというエディタに組み込まれたのがソフトウェアで正規表現を実現した最初の例だという。QEDのマニュアル(参考文献2)を見ると現在の正規表現の基本的な要素はすでに網羅されている。その後、UNIXの標準エディタedにも組み込まれ、以後UNIXでは標準的に利用できるようになる。

一般家庭に普及した「パソコン」で正規表現が利用できるようになるのはかなり後だ。少なくともWindowsの標準状態で正規表現が利用できるようになるのは、Windows 95 OSR1(1999年)のVBScriptあたりからだ。このときVBScriptに対して正規表現オブジェクトが提供され、ソフトウェアの追加インストールなしに正規表現が利用できた。もっとも、Windowsを捨てて、Linuxをインストールすれば、正規表現を利用することはできた。ただ、当時は、サポートされているデバイスが限定されていて、どんなPCにもインストールできるというわけではなく、Windowsの代わりにLinuxを使う敷居は高かった。

Windows 95になってから正規表現が導入されたのは、主にハードウェア的なスペックの向上と、Windowsが仮想メモリに対応して、本格的なソフトウェア実行環境になったからだ。1968年にQEDに組み込まれたとき、正規表現の処理には稼働中に機械語を生成するJIT(Just In Time)コンパイラが組み込まれた。実用的な時間内に処理するために必要な対応だった。しかもいまでいう「メインフレーム」と呼ばれるクラスのコンピュータでの話である。マイクロプロセッサでは、2000年前後にようやく本格的なコンピュータの仲間入りをし、その結果正規表現が利用できるようになったというわけだ。

たとえば、文字列中の波括弧で括られた部分を置き換えたいといったような場合もBASIC的な文字列処理では面倒なものになる。さらに“\”で波括弧をエスケープできるとなるともっと面倒だ。もし、波括弧の対応が不完全だったときエラーでプログラムが止まらないようにするのも面倒な処理だ。

しかし、正規表現を使うとこのあたりはスッキリする。特に最近の正規表現は、「先読み」(Lookaheadの訳語)、「後読み」(同Lookbehind)があるため、こうした処理が短く記述可能だ。だが、正規表現自体は、あまり人間が読むことを想定しておらず、慣れない人の目には、記号の羅列のようにしか見えない。自分が書いたものであっても、しばらく時間がたつときれいサッパリ忘れてしまう。

しかし、正規表現に関しては「チェックサイト」、「テストサイト」などと呼ばれる、正規表現を解析、評価してくれるサイトがあり、これらを利用することで、挙動を視覚化して、結果をわかりやすく表示してくれる。そもそも、コンピュータ自体は、正規表現を理解することは簡単にできる。理解が困難なのは、人間の都合なのである。

たとえば、Debuggexというサイトは、正規表現を状態遷移図にしてくれる(写真01)。あるいは、Rubularでは、照合結果のオブジェクトを簡易表示することができる(写真02)。こういうサイトを使うと、正規表現を比較的簡単に理解できるようになる。もちろん、正規表現のデバッグに利用することもできる。

・Debuggex
https://www.debuggex.com/
・Rubular
https://rubular.com/

  • 写真01: Debuggexで、エスケープ処理ありで波括弧に囲まれた部分を取り出す正規表現を動かしてみた。このサイトは、正規表現を状態遷移図にして表示できる

  • 写真02: 同じく波括弧で囲まれた部分の処理をRubularで実行したもの。正規表現を言語で使うときに比較的よく使われるMatchオブジェクトの名前付きキャプチャーグループを表示できる

さて、今回のタイトルの元ネタは、ウィリアム・S・バロウズの「Nova Express」(邦題、ノヴァ急報)だ。バロウズの祖父は、米国のコンピュータメーカー バローズ(現Unisys)の創業者でもある。そういう興味もあり、サンリオSF文庫に収録された同作を読んだのは1979年のこと。

当時MZ-80Kを使っていて、LEFT$やMID$といった文字列処理関数は理解できたが、この本はちっとも理解できなかった。その4年後にUNIXを利用できるようになったが、正規表現を当時はワイルドカードの親玉程度にしか見ていなかった(厳密には両者は異なる)。なんとか理解して、使えるようになった頃には、もう21世紀になっていたと記憶する。筆者にとってRegular Expressionは、Nova Express同様、当時、理解できない「よく分からないもの」だった。

<参考文献1> Kleene, Stephen C. (1951). Shannon, Claude E.; McCarthy, John (eds.). Representation of Events in Nerve Nets and Finite Automata
https://www.rand.org/content/dam/rand/pubs/research_memoranda/2008/RM704.pdf
<参考文献2>
D. M. Ritchie and K. L. Thompson, "QED Text Editor", MM-70-1373-3
https://wayback.archive-it.org/all/20150203071645/http://cm.bell-labs.com/cm/cs/who/dmr/qedman.pdf