イキるのしんどい。

初老 9 年目が書きつづるアレやコレ。ゴメンなさい、全力では生きてません。

正規表現を使って市区町村を取得するのに挑戦しました

どもども、indieees の山口です。

 

昨日、必要に迫られまして、住所から市区町村を取得しようということをやりました。僕のファイナルアンサーは最後に書いてあります(笑)

 

いくつか方法はありますが、今回は、すでに住所が入力されている前提でしたので、正規表現を使って、市区町村に該当する部分を抜き出そうということに。

とりあえずググりまして……、以下の記事を参考にしました。その節はお世話になりました。

qiita.com

boonx4m312s.hatenablog.com

さて、最初にご紹介した記事に正規表現のパターンが記載してあったので、いきなり完了♪と思ったのですが、以下にもあるパターンが、今回重要だったのです。

なるべく短い正規表現で住所を「都道府県/市区町村/それ以降」に分けるエクストリームスポーツ - Qiita

どういうことかというと、今回は「市と区が含まれる場合、区を優先する」というルールがあったため、@zakuroishikuro(zakuro) さんのパターンでは「○○市□□区」というように取得され、僕のほしい結果とは微妙に異なりました。

 

取得したものを分割すればいいじゃん……そんなことは百も承知ですが、それなら最初から、住所を逆転して市区町村で分割する方法を取ります。

せっかく正規表現で取得してやろうとしているのですから、パターンの工夫でなんとかしたい。そういう質なのです。

 

極力、パターンに市名などは追加したくなかったので、このあたりも何とかしたい。ただ、めじろ (id:boonv4m312s) さんの記事を読むと、都道府県については記述する方がスマートのように思えました。

また、今回は住所が省略されているケースも考慮する必要がありました。例えば、都道府県や市が省略されている(いきなり区から始まるケース)とかですね。

 

諸々を考えまして、最終的には以下のパターンに落ち着きました。

/(北海道|東京都|(?:京都|大阪)府|.+県)?(.+市|.+区|.+郡)?(.+区)?(.+[町村])?(.*)?/u

あぁ、文字サイズでかい……。

 

※訂正※

投稿後に対応できていない部分を再検討しました。

/(北海道|東京都|(?:京都|大阪)府|.+県)?(.{1,2}市|.{1,3}市|.{1,4}市|.{1,5}市|.{1,6}市|.+区|.+郡)?(.+区)?(.{1,3}[町村]|.{1,4}[町村]|.{1,5}[町村])?(.*)?/u

長くなってしまった……。

 

最初に「都道府県」、次に「市区郡」、そして「区」(○○市□□区の場合、□□区だけがほしい)、「町村」、「その他」と、住所がこの順になっている前提のパターンとなります。各々に「?」をつけることで、省略されたケースにも対応します。

PHP で preg_match() に使用した場合、省略または未入力の箇所が空っぽの要素となりますが、後続の処理で無視してください。

 

Qiita みたいな記事となってしまいましたが、いかがだったでしょうか。参考にさせてもらいました記事のお二人には感謝しかありません。ありがとうございます。

 

背中がフローリングの硬さに負けそう。寝具を見直さないと。このままでは、イキるのしんどい。