【正規表現について/難問/正答の方に満点】正規表現でお知恵をお貸し下さい。難しいです。

次のように、各行に郵便番号と住所があります。
パターンは3つあります。

XXX-YYYY,東京都,BBBBBBBB(区)CCCC
XXX-YYYY,AAAA(道or府or県),BBBBBBBB(市)CCCC
XXX-YYYY,AAAA(道or府or県),BBBB(郡)BBBB(町or村)CCCC

これを、一括して、
XXX,YYYY,AAAA,BBBBBBBB,CCCC
としたいです。

なお、置換後の文字列には、都・道・府・県・市・区・郡・町・村」は入れたいです。

どのような正規表現にすればよいでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2008/12/11 20:11:52
  • 終了:2008/12/18 20:15:02

回答(5件)

id:takerudayo No.1

takerudayo回答回数165ベストアンサー獲得回数292008/12/11 20:52:08

ポイント20pt

以下のように指定していただければできます。

検索文字列:([1-9]{3})(-)([1-9]{4})(,)(.+[都道府県])(,)(.+[区市町村])(.+)

置換文字列:\1,\3,\5,\7,\8


解説

検索文字列で指定した()表記にそれぞれ1とか2という番号が自動で付きます。

これに対して置換文字列で読み込んだ文字列を置換文字列で並べています。

例えば置換文字列に「\1\1」と書くと、「XXXXXX」という結果になります。

例えば置換文字列に「\2\1」と書くと、「YYYYXXX」という結果になります。

今回は並び替えにさらに「,」を付加するとのことでしたので、置換文字列内に「,」が書いてあります。


質問に書かれていたパターンと、

「A県B市C区D町E番地F号」

「A府B市C区D町E番地F号」

のような住所だけ確認しました。

それ以外は確認していないので日本全土の住所が変換できるかはわかりません。


難しい内容だったので間違ってたらすいません。

id:crashtruck5

うーん、ごめんなさい、次の点でクリアしてないですね。

1. 「○○郡○○町村」に対応できない

2. 『市』の付く市名に対応できない

2008/12/11 21:08:42
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402008/12/11 21:12:24

ポイント20pt

なんかやりたいことがいまいち分からんけど、

s/^([A-Z]+?)-([A-Z]+?),(.+?(?:都|道|府|県)),(.+?)(群)?(.+?)(市|町|村)(.*)$/$1,$2,$3,$4$5$6$7,$8/g;

あたりか?

正規表現は環境によって使える機能が違うので言語かソフトは明確にしてもらわんと困るんだけど。

id:crashtruck5

どこまでが検索文字列の表現でどこからが置換文字列の表現ですか?

2008/12/11 21:15:34
id:rouge_2008 No.3

rouge_2008回答回数594ベストアンサー獲得回数3512008/12/11 22:29:52

ポイント20pt

以下でたぶん大丈夫だと思いますが・・・

検索文字列

^([0-9]{3})-([0-9]{4})(.*)(区|市|郡|町|村)(.*)$

置換文字列

$1,$2$3$4,$5

または

\1,\2\3\4,\5


出来なかった場合は、使用するソフト名などの環境をお願いします。

id:crashtruck5

ソフト名はEmEditorか秀丸エディタです。

2008/12/11 22:48:50
id:rouge_2008 No.4

rouge_2008回答回数594ベストアンサー獲得回数3512008/12/11 23:14:30

ポイント20pt

こちらはEmEditorフリー版で確認して大丈夫でしたが・・・

出来ませんでしたか?

「東京都町田市本町田」のような住所は例外として、区市などと同じように()内に別途追加すれば大丈夫です。


検索文字列

^([0-9]{3})-([0-9]{4})(.*)(区|市|郡|町|村|田)(.*)$

置換文字列

\1,\2\3\4,\5

id:motokun44 No.5

motokun44回答回数42ベストアンサー獲得回数62008/12/13 12:27:44

ポイント20pt

これでどうですか。

s/^([0-9A-Z]{3})\-([0-9A-Z]{4}),(.+?)(()?(都|道|府|県)())?,((.+?)((郡)))?(.+)((区|市|町|村))/\1,\2,\3\5,\8\9\10\11/;

  • id:rome0315
    >>2. 『市』の付く市名に対応できない
    >>XXX-YYYY,AAAA(道or府or県),BBBBBBBB(市)CCCC

    この「(市)」は「()括弧」がついてるんですか?

    ,今市(市)cccc
    or
    ,今市市ccccc

    括弧がないと

    今市(市名)、市cccc(町名)なのか、
    今市市(市名)、cccc(町名)なのか分からないことはないですか?

    今市市はもうないようですが。
  • id:rouge_2008
    一つ前の質問を確認しました。
    使用するのはEmEditorですね。

    置換文字列には「\1,\2~」の方を指定してください。
  • id:van-dine
    うーん、難しいですね~。
    「cccc」にあたる文字列が「[市区町村]」にマッチしなければ、
    「最大マッチ」という理由で1のやり方が成立すると思うんですけど、
    (実際には「cccc」に「町」が入るケースがあります)
    例えば「東京都町田市」を「.+[市区町村]」という表現では
    「東京都町」ではなく、最長である「東京都町田市」がマッチします。
    最短でマッチさせたい(例えば「東京都町」でマッチさせたい)、という時は
    「.+?[市区町村]」という表現を使います(実装している言語は少ないですが)。

    あと、余談ですが、東京でも
    「東京都町田市本町田」「東京都大島町元町」
    (実在の住所。前者は1の回答も2の回答も不可、後者は伊豆諸島内の住所です)
    というパターンもあります。
    喧嘩を売っているわけではないのですが、参考になれば幸いです。
  • id:rouge_2008
    私が2008-12-11 23:14:30に投稿した回答をオープンしないでください。
    勘違いがありましたので、今確認しています。

  • id:ku__ra__ge
    id:b-windさんの回答は、sedとかviとかの置換コマンド書式っすね。
    「^([A-Z]+?)-([A-Z]+?),(.+?(?:都|道|府|県)),(.+?)(群)?(.+?)(市|町|村)(.*)$」
     ↓
    「$1,$2,$3,$4$5$6$7,$8」
    という置換をするって意味です。
    秀丸とかEmEditorなら置換後の文字は$1じゃなく\1ってなるかな?
  • id:rouge_2008
    申し訳ありませんが、間違いがありましたので、コメントを削除させていただきました。
  • id:rouge_2008
    id:crashtruck5さん

    遅くなりましたが、次の正規表現でいかがでしょうか?
    EmEditorフリー版(Version 6.00.4)で確認しました。
    おそらくProfessional版でも大丈夫だと思います。

    検索文字列
    ^([0-9]{3})-([0-9]{4})(.+[都道府県],)((?:.+郡(?:玉村町|大町町|鹿町町|.+?[町村]))|(四日市市|廿日市市|.+?[市区])|([^郡]+?[町村]))

    置換文字列
    \1,\2\3\4,


    名称に市が付く市は次の4つしかありません。
    (内、市川市と市原市は1文字目が市で問題ないため、四日市市と廿日市市のみ正規表現内に直接記述しました。)
    千葉県市川市
    千葉県市原市
    三重県四日市市
    広島県廿日市市


    質問内にある形式と「東京都町田市本町田」「東京都大島町元町」についても大丈夫です。

    ただし、東京都以外にも区の後ろで区切る住所があるようですが、そちらには対応できていません。(市の後ろで区切ります。)

    北海道札幌市中央区
    宮城県仙台市泉区
    ・・・など他多数


    上記は「○○市○○区」で区切るようになっているようです。(日本郵便が配布している郵便番号データで確認)
    http://www.post.japanpost.jp/zipcode/dl/kogaki.html


    これらにも対応させたい場合は、「(?:(札幌市|仙台市).+区)」のように直接記述するしかないと思います。
    優先順位があるので次のように「(四日市市|廿日市市|.+?[市区])」よりも前に記述します。

    ^([0-9]{3})-([0-9]{4})(.+[都道府県],)((?:.+郡(?:玉村町|大町町|鹿町町|.+?[町村]))|((?:札幌市|仙台市).+区)|(四日市市|廿日市市|.+?[市区])|([^郡]+?[町村]))

    ※置換文字列は上に記述したものと同じです。

    お試しください。

    ※コピーした文字列にスペースが含まれていた場合は、削除してから使用してください。
  • id:rouge_2008
    上記では「郡」を含む市に対応できていませんでしたので、以下の正規表現を使用してください。

    ^([0-9]{3})-([0-9]{4})(.+[都道府県],)((?:蒲郡市|.+郡山市)|(?:.+郡(?:玉村町|大町町|鹿町町|.+?[町村]))|(四日市市|廿日市市|.+?[市区])|([^郡]+?[町村]))

    置換文字列には変更はありません。
    \1,\2\3\4,

    福島県郡山市
    岐阜県郡上市
    愛知県蒲郡市
    奈良県大和郡山市
    福岡県小郡市

    1文字目に郡が付くのは問題ありませんので、蒲郡市のみ直接記述し、大和郡山市、小郡市については「.+郡山市」で対応させました。


    日本郵便が配布している郵便番号データと同じように「○○(都道府県),○○市○○区,」で区切りたい場合は、以下の正規表現を使用してください。

    ^([0-9]{3})-([0-9]{4})(.+[都道府県],)((?:蒲郡市|.+郡山市)|(?:.+郡(?:玉村町|大町町|鹿町町|.+?[町村]))|((?:札幌|仙台|さいたま|千葉|横浜|川崎|新潟|静岡|浜松|名古屋|京都|大阪|堺|神戸|広島|北九州|福岡)市.+区)|(四日市市|廿日市市|.+?[市区])|([^郡]+?[町村]))

    ※こちらの正規表現をコピーした場合、以下の部分に余分な空白(スペース)が出来ます。
    こちらの正規表現を使用する場合は、以下の2箇所の半角スペースを削除してから使用してください。

    |鹿町町|.+? [町村]))
    | (四日市市|

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません