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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

2519閲覧

swiftで住所から郵便番号を取得したい

G_D

総合スコア51

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/05/12 10:01

###前提・実現したいこと
テキストに入力された住所から郵便番号を取得したい。
例えば、
埼玉県上尾市上尾下9999-9999でCSVから郵便番号を取得する。
CSVの書式は以下の通り、
郵便番号,住所1,住所2,住所3
362-0025,埼玉県,上尾市,上尾下
362-0001,埼玉県,上尾市,上
etc...

###発生している問題・エラーメッセージ

実際の住所で
埼玉県上尾市上尾下

埼玉県上尾市上

があり二つ検索で引っかかってしまうため、どちらか一方に絞り込むことができない。

###該当のソースコード
①まずは全国から都道府県(住所1)のみで絞り込む
②埼玉県上尾市上尾下9999-9999に埼玉県の住所の部分一致で絞込み

mstAddressResults = 絞り込んだ埼玉県の配列(住所1,住所2,住所3を結合したもの)
address = 埼玉県上尾市上尾下9999-9999
conteinAddress = ヒットした住所を格納

for mstAddress in mstAddressResults {
if address.conteinsString(mstAddress.address)
conteinAddress.append(mstAddress)
}

###試したこと
最初に数値が出力される手前までを取得
(上記の場合、埼玉県上尾市上尾下)までを取得し完全一致で取得しようと考えたが、実際の仕様で9999が数値ではなく漢字で表示される可能性があるため上記の方法で上手く何丁目前まで動的に取得することができない。
また、9999-9999は9999丁目の9999などで入力される可能性もある。

宜しくお願いします。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

たぶん、
「埼玉県上尾市上尾下9999-9999」
とかだけじゃなくて
「埼玉県上尾市上」の「尾崎マンション203」で
「埼玉県上尾市上尾崎マンション203」
とかいった、番地なしでマンション名のみのパターンもあるかもしれないので、
番地(数字)が始まるまでを完全一致検索するのではなく、
前方一致するものの中で、最長一致するものを検索するのが
妥当なように思います。

以下、サンプルコードです。

swift

1struct Address { 2 var address: String 3 var postCode: String 4} 5 6let mstAddressResults:[Address] = [ 7 Address(address:"埼玉県上尾市上尾下", postCode:"362-0025"), 8 Address(address:"埼玉県上尾市上", postCode:"362-0001"), 9] 10let address = "埼玉県上尾市上尾下9999-9999" 11 12var foundAddress:Address? = nil 13for mstAddress in mstAddressResults { 14 if let range = address.rangeOfString(mstAddress.address) { 15 if range.startIndex == address.startIndex { 16 if foundAddress == nil || (range.endIndex > foundAddress?.address.endIndex) { 17 foundAddress = mstAddress 18 } 19 } 20 } 21} 22print(foundAddress?.postCode) 23print(foundAddress?.address)

投稿2016/05/12 13:03

編集2016/05/12 13:16
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

G_D

2016/05/13 02:21

ご教示いただきました方法で実装行ったところ、期待していた通りの動作になりました! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問