はじまりと、おわり

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

積み残した宿題

レッスン2の演習を覚えていますか。本文「31日と1日と8日と13日」から、ひとり立ちした「1日」と「8日」だけをさがすのに、と[18]日 という手を使いました。前の「と」ごとつかまえる——正直、不格好な手です。

その弱点を、先に確かめておきましょう。本文の順番を入れかえて、「1日」を先頭に置いてみます。

当てはまった場所 — 1か所
1日と31日と8日と13日

塗られたのは「と8日」だけです。先頭の「1日」には前に「と」がいないので、もようの手が届きません。「本文のはじまり」を、ことばにする道具が要ります。

位置に当てはまる、ということ

今日の主役は ^$ です。^本文のはじまりに、$本文のおわりに当てはまります。

当てはまった場所 — 1か所
ねこと、こねこ

塗られたのは先頭の「ねこ」だけです。試しに、もようから ^ を消してみてください。「こねこ」の中の「ねこ」も拾われて、2か所に増えます。

塗られた範囲を、よく見てください。^ねこ は3文字ぶんのもようなのに、塗られたのは「ねこ」の2文字だけ——つまり ^ は、本文の文字を1文字も取りません。「ね」の前という位置に当てはまって、それでおしまいです。

これは、もようの世界では新しい考え方です。いままでの .[0-9] は、かならず本文の文字を1文字つかまえました。^$ がつかまえるのは文字ではなく、文字のあいだの位置——船をつなぎとめる錨(いかり)になぞらえて、アンカーと呼ばれます。

短歌の「句切れ」に似ています。句切れはどの文字でもなく、ことばとことばのあいだにあります。ただし、たとえはここまでです——句切れは読む人が感じ取る意味の切れ目ですが、^$ が指すのは、機械が数えられる「先頭」と「末尾」だけです。

おわりのしるし

上の実験室で、もようを ねこ$ に書きかえてみてください。今度は最後の「ねこ」——「こねこ」のしっぽ——が塗られます。

ここは正直に言っておきます。$ は「ことばのおわり」ではなく、あくまで本文のおわりなので、「こねこ」ということばの途中でも、本文の末尾に接してさえいれば当てはまります。

では、ふたつで挟むと、どうなるでしょう。もようを ^ねこ$、本文を ねこ だけにすると当てはまり、本文を こねこ にすると当てはまらなくなります。挟んだもようは「はじまりから、おわりまで、ぜんぶこのかたちか」という問いになるのです。

よりみち:位置は、くりかえせない

もように ^* と打つと、実験室は「『^』に『*』はつけられません。」と止まります。「あ」を3回くりかえすことはできても、「はじまり」という位置を3回くりかえすことはできないからです。エラーの出かたからも、^ が文字ではないことが透けて見えます。

行ごとに、丸ごと判定する

^…$ で挟む形は、検索よりもチェックで本領を発揮します。下の実験室はいままでと様子がちがい、本文の各行に○×がついています。

行ごとの判定(行ぜんぶが、もように当てはまるか)
  • 12345
  • ×123あ5
  • ×やさい100円
  • 42

これは行ごと判定——各行について「行ぜんぶが、もように当てはまるか」を見るモードです。^[0-9]+$ は「はじまり、数字が1個以上、おわり」、つまり「この行は数字だけでできているか」という問いで、1文字でも数字以外がまじった行には×がつきます。

身に覚えはありませんか。会員登録のフォームで電話番号に空白をまぜて、「数字で入力してください」と叱られたこと——あの裏で動いているのが、この ^…$ の形です。入力チェックと呼ばれる、正規表現のいちばん大きな仕事のひとつです。

宿題の回収

それでは、レッスン2の宿題を今度こそ片づけます。日付たちをひと続きの文に押しこめるのをやめて、1行に1つずつ並べてみましょう。

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

「1日」と「8日」だけに○がつきました。^[18]日$ は「はじまり、1か8、日、おわり」——「31日」のしっぽの「1日」は、行のはじまりに「3」がいるせいで締め出されます。「と」を巻きこむ必要は、もうありません。

演習:郵便番号チェッカー

上の実験室の本文を 123-45671234567123-45678 の3行に書きかえてください。○がつくのを1行目——「数字3つ、ハイフン、数字4つ」の形——だけにするもようを作ります。

  1. まず ^[0-9]+$ を試す。どの行に○がつくか、先に予想を
  2. つぎに ^[0-9]+-[0-9]+$。1行目に○がつくが、まだ穴がある
  3. 桁の数まで、もように書き下す
ヒント1(考え方)

+ は「1個以上」としか言いません。「ちょうど3個」と言いたければ、[0-9] を3回、そのまま並べます。

こたえ

^[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$ です。1の ^[0-9]+$ では、ハイフンのない2行目だけが○になります。2の ^[0-9]+-[0-9]+$ では、3行目——数字が1つ多い偽物——にも○がついてしまいます。+ のゆるさを、桁の数だけ書き並べてふさいだのが、こたえの形です。同じものを何度も書くのは野暮ったいですが、いまの道具箱では、これがいちばん正直な書き方です。

このレッスンで分かったこと

  • ^ は本文のはじまり$ は本文のおわり——文字ではなく位置に当てはまるアンカー
  • アンカーは文字を1文字も取らない。だから、くりかえすこともできない
  • ^…$ で挟むと「ぜんぶ、このかたちか」というチェックの問いになる——フォームの入力チェックの基本形
  • [ の直後の ^ だけは否定、それ以外の場所ではぜんぶアンカー