26.2.4 問題の答え

前節 hwb26.2.3 練習問題 で出した問題の回答例を説明します.なお,以下で説明するのはあくまで例であって,他に解き方がないわけではありません.回答例と自分の考えたパターンが違っても,結果が合っていれば構いません.また,同じ結果を出力する複数の正規表現パターンを考えてみるのも良いでしょう.

問 1. 都道府県名または県庁所在地名にアルファベットの T を含むもの

単純に T を含む行を検索すれば OK です.

grep T  todoufuken.txtreturn2
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.txtreturn2
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.txtreturn2
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.txtreturn2
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.txtreturn2
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.txtreturn2
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 などのスクリプト言語を使って数値と処理するほうが自然でしょう.