26.2.4. 問題の答え
前節 26.2.3. 練習問題 で出した問題の回答例を説明します。なお、以下で説明するのはあくまで例であって、他に解き方がないわけではありません。回答例と自分の考えたパターンが違っても、結果が合っていれば構いません。また、同じ結果を出力する複数の正規表現パターンを考えてみるのも良いでしょう。
問 1. 都道府県名または県庁所在地名にアルファベットの T を含むもの #
単純に T を含む行を検索すれば OK です。
grep T todoufuken.txt
Tochigi Utsunomiya 1984390 6408 Tokyo Tokyo 11773605 2187 Toyama Toyama 1123125 4246 Mie Tsu 1841358 5774 Tottori Tottori 614929 3507 Tokushima Tokushima 832427 4144 Kagawa Takamatsu 1027006 1875
問 2. 都道府県名がアルファベットの T で始まるもの #
都道府県名は行頭から始まりますので、「行頭にある T」を ^T で検索すれば求める結果を得られます。
grep “^T” todoufuken.txt
Tochigi Utsunomiya 1984390 6408 Tokyo Tokyo 11773605 2187 Toyama Toyama 1123125 4246 Tottori Tottori 614929 3507 Tokushima Tokushima 832427 4144
問 3. 県庁所在地名がアルファベットの T で始まるもの #
県庁所在地名は都道府県名の直後にスペースを挟んで書かれています。ですので、スペースに続く T を検索します。
grep " T" todoufuken.txt
Tokyo Tokyo 11773605 2187 Toyama Toyama 1123125 4246 Mie Tsu 1841358 5774 Tottori Tottori 614929 3507 Tokushima Tokushima 832427 4144 Kagawa Takamatsu 1027006 1875
問 4. 都道府県名、県庁所在地名が共にアルファベットの T で始まるもの #
これまでの問で見たように、都道府県名と県庁所在地名の最初の T はそれぞれ “^T” と ” T” で検索できます。両方とも “T” で始まるものを調べる場合、都道府県名と県庁所在地名の間には任意の文字列が入っていて良いので、二つのパターンを “.*” で挟んでつなぎます。
grep “^T.* T” todoufuken.txt
Tokyo Tokyo 11773605 2187 Toyama Toyama 1123125 4246 Tottori Tottori 614929 3507 Tokushima Tokushima 832427 4144
問 5. 都道府県名がちょうど 4 文字であるもの #
都道府県は行頭から始まり、冒頭が大文字アルファベット、2 文字目以降は小文字アルファベットで書かれています。さらに「ちょうど 4 文字」という条件を満たすためパターンの最後にスペースを加え、“^[A-Z][a-z][a-z][a-z] ” を検索します。
grep “^[A-Z][a-z][a-z][a-z] " todoufuken.txt
Gifu Gifu 2100315 10598 Nara Nara 1430862 3691 Saga Saga 884316 2439 Oita Oita 1231306 6337
問 6. 人口が 500 万人以上 1000 万人未満の都道府県 #
500 万以上 1000 万以下の数字は、文字列としては
- 先頭が 5, 6, 7, 8, 9 のいずれか
- 2 文字目以降に 0, 1, …, 9 のどれかが 6 個並んでいる
というように表されます。また数は 1 行に 2 個ありますが、このうち人口を表すのは最初に出てくる数です。そこで前後にスペースを挟んだ ” [5-9][0-9][0-9][0-9][0-9][0-9][0-9] ” を検索します。
grep " [5-9][0-9][0-9][0-9][0-9][0-9][0-9] " todoufuken.txt
Hokkaido Sapporo 5692321 83452 Saitama Urawa 6759311 3797 Chiba Chiba 5797782 5156 Kanagawa Yokohama 8245900 2414 Aichi Nagoya 6868336 5150 Osaka Osaka 8797268 1892 Hyogo Kobe 5401877 8387
もっとも、この検索は grep で可能ですが、数字を単なる文字列として扱っているので不自然な感は否めません。実際には Ruby などのスクリプト言語を使って数値と処理するほうが自然でしょう。