質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

接尾辞のついていない都道府県の名称に正規表現で接尾辞をつける方法

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 1,082

qwe001

score 87

以下のようなデータがあります

北海道
青森
青森県
神奈川
神奈川県
愛知県
群馬
東京
東京都
大阪
大阪府
京都
京都府
広島
熊本
沖縄県

見てわかるとおり、接尾辞に「都」「府」「県」がついているデータと、
ついていないデータが混在しています

接尾辞のついていないデータについては、
全て接尾辞をつけるようにしたいです。

北海道
青森県
青森県
神奈川県
神奈川県
愛知県
群馬県
東京都
東京都
大阪府
大阪府
京都府
京都府
広島県
熊本県
沖縄県

接尾辞がついているデータならば、その接尾辞を抽出することは出来ると思いますが、
接尾辞がついていないデータだけを抽出する方法がおもいつきません。

皆様お知恵をお貸し頂けませんでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+6

たかだか46個ですから、列挙していくのがいいんじゃないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 12:15

    北海道だけは、北海と略したりしませんからねー

    キャンセル

  • 2018/03/15 12:22

    なんで46なのかと思ったら、そういうことですね。

    キャンセル

checkベストアンサー

+5

たんに何パターンかにわければよいのでは?

  • ^東京(?!=都)に都を付加
  • ^(大阪|京都)(?!=府)を府を付加
  • それ以外で[^道県]$には県を付加

(北海道を北海としない前提)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 13:29 編集

    これ!!!!!!!!まさにこれです!!これを求めていました!!!!!!!!
    ありがとうございます!!!!!!以下のようにすることで期待したデータになりました。

    Step1. 置換前「^東京(?!=都)$」置換後「東京都」
    Step2. 置換前「^(大阪|京都)(?!=府)$」置換後「$1府」
    Step3. 置換前「^(?!大阪府|京都府|東京都|北海道|.*県$)(.*?)$」置換後「$1県」

    求めていた回答に最も近かったのでこちらBAとさせて頂きます。
    皆様回答ありがとうございました。またよろしくお願いいたします。

    キャンセル

+1

どこからどういう形で文字列を取得してきて、どういう条件でどこまでやるかによって話がかなり違ってくると思います。

単純に末尾に「都道府県」がついてない都道府県名に「都道府県」の中のどれか適切な文字を追加すれば済むという話なのですか?

それとも、例えば、「青森」という文字列があったとして、それが青森県なのか青森市なのかを判別して処理しなければならないとか?

どこまで対応するかによっては、結構悩ましい問題のようです。

漢数字を数字に直す処理
https://teratail.com/questions/66834

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 12:53

    県名に限定してでの話であるような気がしますが・・・
    おっしゃるように住所の正規化はものすごく面倒な気がします。日々かわっていくものですし!

    キャンセル

  • 2018/03/15 13:02

    住所の正規化の他に、例えば、「青森はリンゴの産地として有名である」というような文字列から、その中の「青森」が県なのか市なのかそれともそれ以外なのかを判定して・・・というような話もあるかもと思ったりしてます。考えすぎなのかもしれませんが。

    キャンセル

  • 2018/03/15 13:06

    ご回答ありがとうございます。市区町村が入るパターンはありません。全て都道府県名のみです。
    条件は、「県」のついていないものに「県」をつけるだけでも出来ればそれでOKだと考えています。
    大阪・京都・東京に府や都をつけるのは正規表現を使わなくても出来ることですので。

    キャンセル

0

正規表現でなんとかするというより連想配列的なものを使うのがよいと思います。
(y_waiwaiさんの回答はそういうことをいわんとしている気もします)

北海道以外の都府県名に末尾をつけたものとつけないものをキーとして全部登録しておいて末尾を省略していないものを値として登録しておけばよいという感じでしょう。

無理に正規表現にしようとしても

if prefecture.match("青森|...") then return prefecutre+"県"
else if prefecture.match("東京") then return "東京都"
else if prefecutre.match("京都|大阪") thren return prefecutre + "府"
else return prefecutre

的なことになるだけでしょうから、冗長な気がします。

normalizedPrefecutre = prefectureMap[prefecture]

の方がシンプルですし多分早いんじゃないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる