目的
チェリー本と下記記事で正規表現を勉強しました。
初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」 - Qiita
勉強した内容のアウトプットのため、記事を書きます。
目標
入力された住所(〇〇県〇〇市〇丁目X-X
)から、エリア(〇〇県〇〇市
もしくは〇〇市
)だけを表示させたい場合の正規表現を考えます。
結論と解説
結論と解説を記載します。
実際に動かしたい方はRubularを使ってみてください。
また、今回は住所をaddress
という変数に代入して、その変数に対して[]
で出力しています。
他にもaddress
に対してslice
を使ったりして文字列を抜き出せますが、そこは冒頭で紹介したチェリー本で勉強してください。
〇〇県〇〇市 を抜き出す場合
住所から「〇〇県〇〇市」を抜き出す正規表現は、.+[市区町村]
です。
address = "群馬県前橋市1-2-3"
address[/.+[市区町村]/]
#=> 群馬県前橋市
address = "長野県阿智村一丁目4-5"
address[/.+[市区町村]/]
#=> 長野県阿智村
解説します。
.+
「一文字以上の任意の文字列」を意味しています。ここが〇〇県〇〇までを表します。
[市区町村]
「市区町村のうちのどれか」を意味しています。
?:
今回はキャプチャする必要がないので、or条件で使用した()につけます。
ある県内の市区町村名を抜き出したい
ある県内の市区町村名を抜き出す場合の正規表現は(?<=〇〇県).+[市区町村]
です。
〇〇県の部分は任意の都道府県名を入れてください。
今回は東京都にしました。
address = "東京都渋谷区1-2-3"
address[/(?<=東京都).+[市区町村]/]
#=> 渋谷区
address = "東京都東村山市一丁目4-5"
address[/(?<=東京都).+[市区町村]/]
#=> 東村山市
解説します。
(?<=東京都)
「東京都」という文字列に対して肯定の後読みをします。これにより抜き出す文字列のスタート位置を決めます。
.+
「一文字以上の任意の文字列」を意味しています。
[市区町村]
「市区町村のうちどれか」を意味しています。
ここで勝手にポイントだと思っているのが、東村山市の2文字目の村で切れていない点です。
+
が貪欲なマッチである点を逆に利用しました。
こちらの方法だと、市区町村以降に「市区町村」を含む地名の場合、集落名まで含んでしまうとご指摘を頂きました。ごもっともです。
より厳密な方法として、頂いたコメントを参照して頂けると幸いです。
まとめ
今回は自分が勉強した内容をまとめました。
正規表現を知る前は住所からエリアを抜き出す方法が分かりませんでしたが、勉強することで自分なりの解決方法が分かりました。