暮らしの中の、もよう

よみもの+手を動かす時間:およそ25分

最初の約束を、回収する

レッスン1で、こんな話をしました。あなたは「090-1234-5678」を見た瞬間、中身を読む前に電話番号だと分かる。その「っぽさ」を文字で書き下せる言語が正規表現だ、と。

あのときのあなたには、まだ道具がありませんでした。いまは違います。.[ ]、くりかえしの * + ?、はじまりとおわりの ^ $、または の | とまとまりの ( )——道具箱はそろいました。

最終レッスンの仕事は、新しい記号を覚えることではありません。手持ちの道具だけで、暮らしの中の「書式」をひとつずつ言い当てていきます。

郵便番号を、組み立てる

日本の郵便番号は「305-8577」のような姿をしています。声に出して、かたちを言い当ててみてください。数字が3つ、棒、数字が4つ

これをもように翻訳します。数字1文字は [0-9] でした。3つほしければ、3回書きます。棒は - をそのまま。つづけて [0-9] を4回。できあがりが [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] です。

まずは普通の検索で、文の中から拾わせてみましょう。

当てはまった場所 — 2か所
305-8577 つくば市。電話は 029-853-2111 です。

郵便番号は拾えました——が、もうひとつ塗られています。電話番号のおしり、「853-2111」です。そこも偶然「数字3つ、棒、数字4つ」のかたちをしていたからで、もようは郵便番号の「意図」ではなく「かたち」しか見ていません。

行ごとの門番にする

だから書式チェックには、レッスン4の道具を使うのでした。^$ で「行のぜんぶがこのかたちであること」を求め、行ごとに○×で判定します。

行ごとの判定(行ぜんぶが、もように当てはまるか)
  • 305-8577
  • ×3058577
  • ×305-857
  • 100-0001

「3058577」は棒がないので×。「305-857」は、$ の手前で数字が1つ足りないので×。入力フォームが「郵便番号の形式で入力してください」と言ってくるとき、裏ではだいたい、この種の門番が立っています。

かたちは見抜ける。意味は見抜けない

もうひとつ、日付をやってみます。「3月14日」のかたちは、数字の並び、月、数字の並び、日。レッスン3の + を使えば ^[0-9]+月[0-9]+日$ と書けます。

行ごとの判定(行ぜんぶが、もように当てはまるか)
  • 3月14日
  • 12月31日
  • 13月99日
  • ×3月14

「3月14日」も「12月31日」も○。ところが、3行目を見てください。「13月99日」にも○がついています。カレンダーのどこにもない日です。

これは、もようという道具の正直な姿です。もようは「数字が並んで、月、数字が並んで、日」というかたちを完璧に見抜きますが、「13月は存在しない」という意味はひとことも語っていません。かたちの門番と、意味の門番は、別の係なのです。

よりみち:レッスン7の限界とは、別の話

前のレッスンで見た限界——かっこの対応のような「数えるしごと」は原理的にできない——は、どう書いても越えられない壁でした。今日の「13月」は壁ではなく、役割分担の話です。月を1〜12にしぼるもようは、がんばれば書けます(^(1[0-2]|[1-9])月 のように)。でも実務では、かたちはもようで、意味の検査は普通のプログラムで、と分担するのがきれいなやり方です。コース1で書いたような「もし〜なら」の出番ですね。

演習の前に——時刻のもよう

最後の実験台をひとつ用意しました。デジタル時計の「9:05」のかたち、数字の並び、コロン、数字2つです。

行ごとの判定(行ぜんぶが、もように当てはまるか)
  • 9:05
  • 23:59
  • ×9:5
  • ×930

「9:5」と「930」が×になる理由は、もう自分のことばで説明できるはずです。そして「99:99」と打ち足せば○になることも、もう驚かないはずです——かたちと意味は、別の係でした。

最終演習:あなたの書式を、ひとつ

あなたの身の回りから「書式」をひとつ選んで、上の実験室でもようを書いてください。本文の欄には、当てはまってほしい例と、はじいてほしい例を数行ずつ並べます。

候補が思いつかなければ、このあたりから。

  1. 学籍番号や社員番号(例:B2310585)
  2. 飛行機の便名(例:NH006、JL123)
  3. 車のナンバーの地名のうしろ(例:300 あ 12-34)
ヒント1(手順)

いきなり記号を書かず、まず日本語で「かたち」を言い当ててください。「大文字が2つ、そのあと数字の並び」のように。翻訳はそれからです。

こたえの例(便名)

「大文字2つ+数字の並び」と読んだなら ^[A-Z][A-Z][0-9]+$。NH006 や JL123 に○、NH だけや 006 だけには×がつきます。ただし、これが唯一の正解ではありません。「数字はちょうど3つ」と読んで並べて書く手も、「2文字目は省略されることもある」と読んで ? を足す手もあります。もようは、あなたがその書式をどう読んだかの表明です。正解はひとつではありません。

歩いてきた道(コース3の総括)

  • もよう——特定のことばではなく、ことばの「かたち」を言い当てる、世界でいちばん小さい部類の言語
  • 道具——.[ ] と範囲、くりかえしの * + ?、はじまりとおわりの ^ $|( )、そして記号を文字に戻す \
  • 機械——もようの正体は状態機械。前から1文字ずつ、後戻りせずに読むので、暴走しない
  • 限界——数えるしごとはできない。そして、かたちは見抜けても意味は見抜けない
  • 実践——暮らしの書式は「日本語でかたちを言い当ててから、翻訳する」。正解はひとつではない

庭の、次の区画へ

このコースの道具は、明日から使えます。Ctrl+F の検索窓、エディタの置換、ファイルの一括リネーム——もようを受けつける窓は、あなたの思っているよりたくさんあります。

そして庭には、つづきの区画があります。もようの機械は本文を前から1文字ずつ読みましたが、電話帳のように「そろっている」ものからさがすなら、もっと速い手があります——その話がコース4「アルゴリズムのかたち」です。レッスン7で出会った「もようには越えられない壁」の正体を、紙の機械で確かめに行くのがコース5「計算できる、とはどういうことか」です。

8つのレッスンで、あなたは「っぽさ」を感じるだけの人から、それを文字で書き下せる人になりました。

修了、おめでとうございます! あなたはもう、検索窓の裏に住む小さな言語の、れっきとした話者です。