- PR -

住所の正規表現

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 2008-10-25 10:35
WinXP & VS2005のC# & 文字コードUTF-8で開発しています。

住所の番地で改行を挿入したいのですが、うまく読み取ってくれません(郵便番号の正規表現をサンプルにしたのですが)。
文字中に'-'or'ー'があり、4桁まで数値が続いていれば、そこに改行コードを入れると言うものですが・・。

String _str = "東京都足立区テスト町1-1-1000アパート101号";
Regex regex = new System.Text.RegularExpressions.Regex(@"-[0-9]{1}|-[0-9]{2}|-[0-9]{3}|-[0-9]{4}|ー[0-9]{1}|ー[0-9]{2}|ー[0-9]{3}|ー[0-9]{4}");//番地(数値で無くなる所から'-'or'ー')
int _ln1 = line.LastIndexOf(regex);
if (_ln1 > 0) {
 line = line.Substring(0,_ln1) + "\r" + line.Substring(_ln1);
}

また、ハイフンの入力にはキーボードで入力すると長音等もあり、文字コードによって認識の不可もあると聞きました。
「-XXXX」の書式で包括的に取得するにはどのようにすればよろしいでしょうか?

中間アプリの為、入力文字列の禁止・置換等はできていないようです。ただ、認識できないものは明確にしなければいけなく。
お分かりになりましたらよろしくお願いします。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-10-25 11:24
確認させてください。

どのように改行したいのですか?

引用:

未記入さんの書き込み (2008-10-25 10:35) より:
文字中に'-'or'ー'があり、4桁まで数値が続いていれば、そこに改行コードを入れると言うものですが・・。



"東京都足立区テスト町1-1-1000アパート101号"
の例で言うと
"東京都足立区テスト町
1-1-1000アパート101号"
という風に改行したいのでしょうか。

正規表現を見る限りでは、
"東京都足立区テスト町1
-1-1000アパート101号"
と改行したいように読み取れるので、どう改行したいのかわかりませんでした。

1-1-1000のようなハイフン区切りの書き方でなく、
「1丁目1番1000号」「1丁目1000番地」等の書き方は
考慮しなくてよいのでしょうか?また、数値部分が全角のアラビア数字や漢数字
ということもあるかと思いますが、同様に考慮は必要ないでしょうか?

引用:

String _str = "東京都足立区テスト町1-1-1000アパート101号";
Regex regex = new System.Text.RegularExpressions.Regex(@"-[0-9]{1}|-[0-9]{2}|-[0-9]{3}|-[0-9]{4}|ー[0-9]{1}|ー[0-9]{2}|ー[0-9]{3}|ー[0-9]{4}");//番地(数値で無くなる所から'-'or'ー')
int _ln1 = line.LastIndexOf(regex);
if (_ln1 > 0) {
 line = line.Substring(0,_ln1) + "r" + line.Substring(_ln1);
}



このコードはコンパイル通らないんですが、
(lineが未定義、仮に_strというのは間違いで、_strでなくlineなんだとして、
line.LastIndexOfの引数になぜかregexを渡しているので意味が不明)

LastIndexOfメソッドというと文字列の末尾から検索するメソッドだから、
ひょっとして、

"東京都足立区テスト町1-1-1000
アパート101号"

のようにマンション名などの箇所で改行したいということでしょうか?
だとすれば今提示されている正規表現もある程度納得がいきます。

引用:

また、ハイフンの入力にはキーボードで入力すると長音等もあり、文字コードによって認識の不可もあると聞きました。
「-XXXX」の書式で包括的に取得するにはどのようにすればよろしいでしょうか?



住所は画面からの入力ですか?外部から取り込むのですか?
画面からの入力であれば、UNICODEでの入力ですから、
UNICODEで入力可能な「−」っぽい記号を調べればよいのでは?

外部からデータを受けるのであれば、その文字コードによるのでは?

質問は正規表現の書き方かと思ったのですが、
「−」っぽいものの文字一覧を聞きたかったのですか?それとも両方?
ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 2008-10-25 11:57
あ、コレ、つい最近やりましたよ。
宛名ラベルの文言でしょ。
横20文字×2行

入力は
住所1:全角70文字(必須)(県市区町村 を入力)
住所2:全角70文字(必須)(主に番地・マンション名・〜号室等を入力)
住所3:全角40文字(任意)(同上)

で、住所1は郵便番号検索で自動的に入る部分なんでこーゆー分け方になって
います。

2行計40文字に収まらない場合は後ろちょんぎってもいい、という摩訶不思議
な仕様ですwなんたって180文字を40文字のスペースに収めよ、なんちゅー
無理難題ですから。でも、とある統計によると、日本の住所は大概は40文字で
足りるとか。京都の250文字を越える住所に住む人間はごめんなさい、ってこ
とで。

面倒だけど、1文字ずつ前から調べていった方がいいんじゃないですか?
有限パターンですが、正規表現で無理するより、switch/case の場合わけの
方がデバッグも手間がかかるし、潜在バグ多くなりそうですがね。


未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 2008-10-25 13:22
ありがとうございます。

ぴあちゃんさん、おっしゃる通りです(仕様もまるで同じ)。
よねKENさんのおっしゃるように、住所入力でも入力フォーマットがたくさんありますね。正規表現で番地までを特定し、改行コードを入れたいと考えてます。
(そもそもソースがおかしかったですね。indexOfじゃだめですね。貼り付けていただいてすみません)

住所のフォーマットの「X町目」などは、他文字列と同様に考えておりますが、
全角数字はおっしゃるとおりです。

"東京都足立区テスト町1-1-1000(1000)
アパート101号"
のように印字したいと思ってます(PDFLib)。

ぴあちゃんさんのおっしゃる通り、一文字づつ検索した方がいいんですかね・・。

[ メッセージ編集済み 編集者: 未記入 編集日時 2008-10-25 13:24 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-10-25 19:48
追加のご説明を読みましたが、仕様や住所データの前提条件等にまだ不明な点があります。

引用:

未記入さんの書き込み (2008-10-25 13:22) より:
ぴあちゃんさん、おっしゃる通りです(仕様もまるで同じ)。



どの辺がまるで仕様が同じなのでしょう???
ぴあちゃんさんの仕様は、
・入力元は住所1〜3の3項目
・この住所1〜3を20文字×2行に整形する。
・40文字を越える分は無視してよい。
・どのように最大40文字で2行のまとめるのかは未定義(コメントに説明なし)。
だと理解しました。

で、未記入さんの方では、改行は番地の最後(マンション名の前)に
入れたいということだと理解しましたが、これとぴあちゃんさんの仕様と
どこが同じなのかがわかりませんでした。

例えば、ぴあちゃんさんの仕様のうち「20文字×2行に納める」という
部分が未記入さんの作ろうとしているものでも同様の条件なら、
「改行は番地の最後(マンション名の前)」という仕様ではこの制約を満たせない
可能性が高いように思いますし。(番地までの表記で20文字を超える住所はよくあるから)

このままだと具体的なアドバイスは難しいので、仕様を整理されるとよいかと思います。

■未記入さんの仕様で明確になっている点

(1) 処理の対象となる住所は、
"東京都足立区テスト町1-1-1000アパート101号"
のような一つの文字列である。
(2) 改行は番地の後(マンション名の前に改行を入れたい。

■仕様の不明な点
(a) 例えば、"東京都足立区テスト町1-1-1000アパート101号" という住所は、
"東京都足立区テスト町1-1-1000-101" と記述することがありますが、
以下のような例もあるのでマンション名がない場合は正確に分割することは不可能です。
(例1)"東京都足立区テスト町1-1-1000-151-A-101" → 151-A-101 が マンション部分
(例2)"東京都足立区テスト町1-1-101" → 101がマンション部分
この場合に末尾の"-XXXX"(XXXXは数字)を探す方法だと改行はされませんがOKですか?

(b) ハイフンで繋ぐ書き方以外を許すならどこまで対応しますか?
(例1)×丁目Y番Z号
(例1')×丁目Y番Z (後ろの"号"を省略)
(例2)×丁目Y番地
(例2')×丁目Y (後ろの"番地"を省略)

引用:

住所のフォーマットの「X町目」などは、他文字列と同様に考えておりますが、
全角数字はおっしゃるとおりです。



他の文字列と同様とは?

"東京都○○区ほげほげ×丁目Y番Z号マンション@IT303号室"

という場合もマンション名の前で改行したいのですよね?
その場合、住所文字列のうち、数字+"番"や"号"や"番地"という箇所を意識する必要があります。

引用:

ぴあちゃんさんのおっしゃる通り、一文字づつ検索した方がいいんですかね・・。



正規表現で処理するか、1文字ずつチェックするか、どちらの方法を取るにしても、
とりうる住所データの形やそれに対してどのように処理するのかの
仕様を明確にするのが先だと思います。

厳密にやろうとすると実装方法に関わらずイレギュラーなパターンへの対処ばかりになり、複雑怪奇な実装になりかねません。
もともとの入力データを住所1〜3のように分けておいて、わざわざ分割しなくてよいようにするか、
あるいは、単純に×文字で改行するというような仕様に持っていく方がよいと思いますよ。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-10-25 20:02
とりあえず、住所文字列の末尾から「"-" + アラビア数字(半角/全角)1〜4桁」を
検索してその直後で改行するコード書いてみました。
参考までに。

コード:

String address = "東京都足立区テスト町1-1-1000アパート101号"; // OK
//address = "東京都足立区テスト町1-1-1000アパート101号"; // OK
//address = "東京都足立区テスト町1-1-1000アパートー101"; // OK
// ただし、ハイフン以外に長音記号も
// 正規表現のチェック対象に入れるとNGになる。

Regex regex = new System.Text.RegularExpressions.Regex(@"-[0-90-9]{1,4}");

MatchCollection mc = regex.Matches(address);
int index = 0;
if (mc.Count > 0)
{
Match m = mc[mc.Count - 1];
index =m.Index + m.Length;
address = address.Substring(0, index) + "\r" + address.Substring(index);
}
Debug.WriteLine(address);




[ メッセージ編集済み 編集者: よねKEN 編集日時 2008-10-25 20:07 ]
未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 2008-10-25 21:38
よねKENさん、ありがとうございます!

ご丁寧に推察いただきありがとうございます。

指摘いただいた点ですが、基本的にはデータの改変は行わず、本データのまま貼り付けます。明確な最大文字数はありませんが、印字をはみ出してしまうのは仕方ない(PDFLibの半指定で自動的にカットされます)

■仕様の不明な点
(a) 例えば、"東京都足立区テスト町1-1-1000アパート101号" という住所は、
"東京都足立区テスト町1-1-1000-101" と記述することがありますが、
以下のような例もあるのでマンション名がない場合は正確に分割することは不可能です。
(例1)"東京都足立区テスト町1-1-1000-151-A-101" → 151-A-101 が マンション部分
(例2)"東京都足立区テスト町1-1-101" → 101がマンション部分
この場合に末尾の"-XXXX"(XXXXは数字)を探す方法だと改行はされませんがOKですか?

仕様では番地のフォーマット(XXXX-XXXX-XXXX)の途中で自動的に改行されるのが、よろしくないと言う事で、数字ハイフン続きは一行とみなし、途中で改行される可能性がある場合は、市町村の値で一度改行します。
ぴあちゃんさんと一緒の仕様(市町村名内でもオーバーはカットと言うのは違いますが)と言うのは、都道府県+市町村+番地+アパート名と分かれてきます。それを全角スペースで結合(Trim+全角スペース排除)させますので、区切り位置については明確になります。

ですので、丁目番地の記入様式はそのまま都道府県文字列と同等の扱いで良いという仕様です。

詳細の仕様を明記せずにもうしわけありませんでした。アドバイスいただきました(実際テストもしていただいた)内容で解決できそうです。ありがとうございました。
ゆむ
会議室デビュー日: 2008/10/25
投稿数: 2
投稿日時: 2008-10-25 21:54
元データとして、都道府県・市区町村が分かれているなら、「日本全国住所データベース」と引き当てることも検討して良いと思うんですけど。
処理にすっげー時間かかりますけど。

厳密なチェックが可能ですし、存在しない住所を弾き出すこともできますよ。

※ただし、京都市を除く。

[ メッセージ編集済み 編集者: ゆむ 編集日時 2008-10-25 21:56 ]

スキルアップ/キャリアアップ(JOB@IT)