もようにできないこと
ここまでの道具で、さがせないもの
ここまでであなたは、文字・候補・くりかえし・はじまりとおわり・枝分かれと、ひと通りの道具を手にしました。「ことばのかたち」と呼べるものの多くは、もう書けます。
では、こんな注文はどうでしょう。「かっこの対応が取れている文」をさがしてほしい——開いた「(」が、かならず「)」で閉じられている文です。文章の校正では、ごくふつうの頼まれごとです。
このレッスンは、その注文に挑んで、敗れる回です。そして敗れ方のほうに、正規表現というもようの正体が書いてあります。
1段なら、書ける
まず、入れ子のないかっこ——「(なにか)」をつかまえてみましょう。「開きかっこ、閉じかっこ以外がつづいて、閉じかっこ」と読み下せば、もようは ([^)]*) です。
これ(ここだけ)と、あれ(あそこ)
「(ここだけ)」と「(あそこ)」の2か所が塗られました。ここまでは、候補の反転 [^ ] とくりかえし * の、素直な組み合わせです。
入れ子で、破れる
では、かっこの中にかっこがある文ではどうでしょう。実験室の本文を (外(内)外) に書きかえてみてください。
塗られたのは「(外(内)」まで——内側の閉じかっこで、外側のかっこが閉じられてしまいました。最後の「外)」は置き去りです。このもようは「)以外を進めるだけ進み、)が来たら閉じる」としか言っていないので、読み手には内側の「)」と外側の「)」の区別がつきません。
がんばれば、深さ2まで対応したもようは書けます。「外のかっこの中に、内のかっこがちょうど1組」と読み下した ([^()]*([^()]*)[^()]*) です。
(外(内)外)
たしかに全体が塗られます。けれどこのもようは長く、読みにくく、しかも深さ2の専用品です。本文を深さ3の (一(二(三)二)一) にすると、外側をつかまえそこねて、内側の「(二(三)二)」しか塗れません。
深さ3用、深さ4用……と、もようをさらに長くしていくことは(うんざりしますが)できます。「10段まで」と深さを区切れば、長く醜いもようが、いちおう書けるのです。書けないのは、**「何段でも」**のほうです。
なぜ書けないか——状態は、増やせない
前のレッスンの種を回収します。もようの裏で動く状態機械の状態の数は、もようを書いた時点で決まっているのでした。読んでいる途中で、状態を増やすことはできません。
ところが「何段でも」の入れ子に付き合うには、いま何段目にいるかを数えて覚えておく必要があります。深さ10を見分けるには10とおり、深さ100には100とおり——深さのぶんだけ、覚える場所が要ります。機械が持っているのは、最初に決めた有限個の状態だけです。
指折り数えることを思い浮かべてください。両手で10まで数えられますが、11からは指が足りなくなり、人間はそこで紙に「正」の字を書きはじめます。もようには、その紙がありません。
このたとえには、ずれがひとつあります。人間は数えている途中で紙を取りに行けますが、もようは、読みはじめる前に道具立てをぜんぶ決めておかなければなりません。
だからこう言い切れます——有限の覚え書きで、無限を数えることはできない。入れ子の対応が書けないのは、あなたの腕の問題ではなく、原理の問題です。
欠陥ではなく、身の丈
「数えられない」と聞くと欠陥のようですが、これは身の丈の話です。もようは「数えなくていい仕事」の専門家で、専門をしぼったからこそ、どんな本文でも1文字ずつ淡々と進み、速くて、暴走しません。
数える仕事には、数えられる道具を使えばいい。コース1〜2であなたがさわったプログラミング言語は、変数という「紙」を持っていて、かっこの深さを数えられます。
道具を選ぶとは、こういうことです。万能の道具をさがすのではなく、仕事のかたちに合わせて、限界ごと道具を選ぶ。目の前の仕事に「これは数える仕事だろうか」と問えるようになったあなたは、もう正規表現を使い分けられます。
⟡ よりみち:世の中の「正規表現」は、すこしはみ出している
じつは、世の中のプログラミング言語に積まれている「正規表現」には、後方参照などの拡張機能が足されていて、教科書の意味での「正規」を超えているものもあります。その代わり、書き方しだいで検索が急に遅くなる——暴走する——危険も一緒に抱え込みました。この庭のもようは、わざと「正規」のままにしてあります。速さと安全を、手放さないためです。
✎ 演習:破れ方を観察する
破れる場所を自分で言い当てられたら、このレッスンは身についています。
- もよう
([^)]*)を本文((中))に当てると、どこからどこまでが塗られるでしょう。先に予想してから、実験室で確かめてください - 深さ2のもよう
([^()]*([^()]*)[^()]*)を、入れ子のない本文これは(あいさつ)ですに当ててみてください。意外な結果になります - 2の結果になった理由を、もようを左から読み下して説明してみてください
ヒント1(考え方)
深さ2のもようは、内側のかっこが「あってもよい」ではなく「ちょうど1組ある」ことまで要求しています。
こたえ
1は「((中)」が塗られます。最初の「)」で、いちばん外のかっこが閉じてしまうからです。2は1か所も塗られません。深さ2の専用品は、深さ1の文にはもう当てはまらない——これが3のこたえで、もようの途中にある内側の「(」「)」が、本文に実在することを要求しているためです。深さ1も拾いたければ、枝分かれでつないだ ([^()])|([^()]([^()])[^()]) のように、深さが増えるたび、もようは雪だるま式にふくらんでいきます。
このレッスンで分かったこと
- 入れ子のないかっこは
([^)]*)で書ける。入れ子があると、内側の閉じかっこで破れる - 深さを区切れば(長く醜いが)書ける。「何段でも」は書けない
- 状態機械の状態は、もようを書いた時点で決まっていて、読みながら増やせない——有限の覚え書きで、無限は数えられない
- これは欠陥ではなく身の丈。数えない仕事だから速くて暴走しない。数える仕事には、数えられる言語を使う