はじまりと、おわり
積み残した宿題
レッスン2の演習を覚えていますか。本文「31日と1日と8日と13日」から、ひとり立ちした「1日」と「8日」だけをさがすのに、と[18]日 という手を使いました。前の「と」ごとつかまえる——正直、不格好な手です。
その弱点を、先に確かめておきましょう。本文の順番を入れかえて、「1日」を先頭に置いてみます。
1日と31日と8日と13日
塗られたのは「と8日」だけです。先頭の「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-4567、1234567、123-45678 の3行に書きかえてください。○がつくのを1行目——「数字3つ、ハイフン、数字4つ」の形——だけにするもようを作ります。
- まず
^[0-9]+$を試す。どの行に○がつくか、先に予想を - つぎに
^[0-9]+-[0-9]+$。1行目に○がつくが、まだ穴がある - 桁の数まで、もように書き下す
ヒント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文字も取らない。だから、くりかえすこともできない
^…$で挟むと「ぜんぶ、このかたちか」というチェックの問いになる——フォームの入力チェックの基本形[の直後の^だけは否定、それ以外の場所ではぜんぶアンカー