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

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

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

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2126閲覧

JavaScriptで住所分割機能を正しく行いたい

xlostdjx

総合スコア39

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2022/04/06 07:48

編集2022/04/07 09:01

前提

JavaScriptで21文字以上かつ特定の条件を満たしたときに住所を分割する機能を作っています。
ただ、特定のパターンの時の分割が上手くいっていないです。

トランスパイルする前のコードはcoffeescriptですが、
JSの方が回答が付きやすいと判断し今のタグです。

実現したいこと

(例)北海道新市豊平区月寒西三条6丁目1-四十一707
の住所が入力されている時、

分割1 =北海道新市豊平区月寒西三条
分割2 = 6丁目1-四十一

のようにしたいが現在は、

分割1 = 北海道新市豊平区月寒西三条6丁目1-四十一707
分割2 = 707

になっています。

該当のソースコード

JavaScript

1 2 住所を分割する = (function(_super) { 3 __extends(Adjust住所を分割する, _super); 4 5 function Adjust住所を分割する(request, address) { 6 var exclusions; 7 exclusions = []; 8 Adjust住所を分割する.__super__.constructor.call(this, request, address, exclusions, null); 9 this.proof = function(direction, callback) { 10 var addressIndex, maxLength, pattern1, pattern1_2, pattern2, pattern2_2, pattern3, pattern3_2, pattern4, pattern4_2, pattern5, pattern5_2, proposal; 11 maxLength = 21; 12 proposal = { 13 kind: "info", 14 title: "住所を分割しました。", 15 description: "" + maxLength + "文字を越えていたので分割しました。", 16 columns: [] 17 }; 18 pattern1 = /[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-)[0-90-9〇一二三四五六七八九]{1,}.*/g; 19 pattern2 = /[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九]{1,}.*/g; 20 pattern3 = /[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九]{1,}.*/g; 21 pattern4 = /[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}.*/g; 22 pattern5 = /[0-90-9〇一二三四五六七八九]{3,}.*/; 23 pattern1_2 = /^[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-)[0-90-9〇一二三四五六七八九]{1,}/g; 24 pattern2_2 = /^[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九]{1,}/g; 25 pattern3_2 = /^[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九]{1,}/g; 26 pattern4_2 = /^[0-90-9〇一二三四五六七八九]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九]{1,}/g; 27 pattern5_2 = /^[0-90-9〇一二三四五六七八九]{3,}/; 28 addressIndex = -1; 29 return async.eachSeries(direction.addresses, function(address, addressNext) { 30 var firstLine, matchValue, matchs1, matchs2, matchs3, matchs4, matchs5, moreMatchValue, moreMatchs, newLines, oldLines, secondLine; 31 addressIndex++; 32 newLines = []; 33 oldLines = deepcopy(address.lines); 34 if (oldLines.length > 0 && oldLines[0].length >= maxLength && (oldLines.length === 1 || (oldLines.length > 1 && oldLines[1].length === 0))) { 35 firstLine = oldLines[0]; 36 secondLine = ""; 37 matchs1 = firstLine.match(pattern1); 38 matchs2 = firstLine.match(pattern2); 39 matchs3 = firstLine.match(pattern3); 40 matchs4 = firstLine.match(pattern4); 41 matchs5 = firstLine.match(pattern5); 42 matchValue = ""; 43 if (matchs1 != null) { 44 matchValue = matchs1.join(""); 45 moreMatchs = matchValue.match(pattern1_2); 46 } else if (matchs2 != null) { 47 matchValue = matchs2.join(""); 48 moreMatchs = matchValue.match(pattern2_2); 49 } else if (matchs3 != null) { 50 matchValue = matchs3.join(""); 51 moreMatchs = matchValue.match(pattern3_2); 52 } else if (matchs4 != null) { 53 matchValue = matchs4.join(""); 54 moreMatchs = matchValue.match(pattern4_2); 55 } else if (matchs5 != null) { 56 matchValue = matchs5.join(""); 57 moreMatchs = matchValue.match(pattern5_2); 58 } 59 console.log("matchValue: " + matchValue); 60 if (matchValue.length > 0) { 61 firstLine = firstLine.replace(matchValue, ""); 62 secondLine = matchValue; 63 if (moreMatchs != null) { 64 moreMatchValue = moreMatchs.join(""); 65 console.log("moreMatchValue: " + moreMatchValue); 66 if (matchValue !== moreMatchValue && (matchValue.length - moreMatchValue.length) > 2) { 67 firstLine = firstLine.replace(matchValue, ""); 68 firstLine = "" + firstLine + moreMatchValue; 69 secondLine = matchValue.replace(moreMatchValue, ""); 70 } 71 } 72 if (!secondLine.match("^(、|.|・|?|||ー|丁目|番地|号|-)")) { 73 newLines.push(firstLine); 74 newLines.push(secondLine); 75 } 76 } 77 if (newLines.length > 0) { 78 address.lines = newLines; 79 proposal.columns.push({ 80 paths: [ 81 { 82 key: "addresses", 83 index: addressIndex 84 }, { 85 key: "lines", 86 index: 0 87 } 88 ], 89 values: { 90 old: oldLines[0], 91 "new": newLines[0] 92 }, 93 matchs: [] 94 }); 95 proposal.columns.push({ 96 paths: [ 97 { 98 key: "addresses", 99 index: addressIndex 100 }, { 101 key: "lines", 102 index: 1 103 } 104 ], 105 values: { 106 old: oldLines[1], 107 "new": newLines[1] 108 }, 109 matchs: [] 110 }); 111 } 112 } 113 return addressNext(); 114 }, function(err) { 115 if (proposal.columns.length === 0) { 116 proposal = null; 117 } else { 118 proposal.direction_key = direction.key; 119 } 120 return callback(err, proposal); 121 }); 122 }; 123 } 124

追記

やり方が間違っているかも知れませんが、
[0-90-9〇一二三四五六七八九]を
[0-90-9〇一二三四五六七八九十」にしましたが、

北海道新市豊平区月寒西三条6刀丁目1-四十一707

北海道新市豊平区月寒西三条6刀丁目1-四十一
707
で分割されてしまいます。。

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

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

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

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

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

Lhankor_Mhy

2022/04/06 08:09

__extends には何が入っていますか?
Lhankor_Mhy

2022/04/06 08:21 編集

代入式が途中で切れていますが、これは問題ありませんか? たぶん、何かのクラスを継承しているのだと思いますが……
xlostdjx

2022/04/06 08:24

>__extends には何が入っていますか? __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; です。 >代入式が途中で切れていますが、これは問題ありませんか? __extends のことでしょうか?
xlostdjx

2022/04/06 08:26

>たぶん、何かのクラスを継承しているのだと思いますが…… 今回の分割部分に対する実装なので、 継承のことは度外視で大丈夫です。
Lhankor_Mhy

2022/04/06 08:27

しかし、継承元のクラスがないと、問題を再現できないのですが…… カンで答えてよい、ということであればそのようにしますが……
Lhankor_Mhy

2022/04/06 08:30

トランスパイルする前のコードを提示した方が回答が付きやすいかと思います。 また、node.js であればそのように質問タグをつけた方が回答が付きやすいかと思います。
xlostdjx

2022/04/06 08:32

>しかし、継承元のクラスがないと、問題を再現できないのですが…… 継承元のクラスとは、どれのことを指していますか? 正直この辺りを追い出すと複雑なので、 カンで答えていただいてもいいかなとも思っています。 >トランスパイルする前のコードを提示した方が回答が付きやすいかと思います。 トランスパイルする前のコードはcoffeescriptなので、 JSの方が回答が付きやすいと判断しました。 >また、node.js であればそのように質問タグをつけた方が回答が付きやすいかと思います 承知しました。
guest

回答1

0

ベストアンサー

カンで答えていただいてもいいかなとも思っています。

カンですが、対象の文字列新潟県新潟市西蒲区適当八-三十四-三十一に含まれている-(\u002d)が、いずれの正規表現にも含まれていないのが原因ではないでしょうか。


コメントを受けて追記

コアと思われるコードを適当に抜き出して、ES6にして入力をArrayにしてを正規表現に加えて実行してみましたが、問題がなさそうです。

js

1maxLength = 21; 2proposal = { 3 kind: "info", 4 title: "住所を分割しました。", 5 description: "" + maxLength + "文字を越えていたので分割しました。", 6 columns: [] 7}; 8pattern1 = /[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-)[0-90-9〇一二三四五六七八九十]{1,}.*/g; 9pattern2 = /[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九十]{1,}.*/g; 10pattern3 = /[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九十]{1,}.*/g; 11pattern4 = /[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}.*/g; 12pattern5 = /[0-90-9〇一二三四五六七八九十]{3,}.*/; 13pattern1_2 = /^[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-)[0-90-9〇一二三四五六七八九十]{1,}/g; 14pattern2_2 = /^[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|号)[0-90-9〇一二三四五六七八九十]{1,}/g; 15pattern3_2 = /^[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|-|番)[0-90-9〇一二三四五六七八九十]{1,}/g; 16pattern4_2 = /^[0-90-9〇一二三四五六七八九十]{1,}(、|.|・|?|||ー|丁目|-)[0-90-9〇一二三四五六七八九十]{1,}/g; 17pattern5_2 = /^[0-90-9〇一二三四五六七八九十]{3,}/; 18addressIndex = -1; 19['新潟県新潟市西蒲区適当八ー三十四ー三十一'].forEach(function(address, addressNext) { 20 var firstLine, matchValue, matchs1, matchs2, matchs3, matchs4, matchs5, moreMatchValue, moreMatchs, newLines, oldLines, secondLine; 21 newLines = []; 22 oldLines = [address]; 23// if (oldLines.length > 0 && oldLines[0].length >= maxLength && (oldLines.length === 1 || (oldLines.length > 1 && oldLines[1].length === 0))) { 24 firstLine = oldLines[0]; 25 secondLine = ""; 26 matchs1 = firstLine.match(pattern1); 27 matchs2 = firstLine.match(pattern2); 28 matchs3 = firstLine.match(pattern3); 29 matchs4 = firstLine.match(pattern4); 30 matchs5 = firstLine.match(pattern5); 31 matchValue = ""; 32 if (matchs1 != null) { 33 matchValue = matchs1.join(""); 34 moreMatchs = matchValue.match(pattern1_2); 35 } else if (matchs2 != null) { 36 matchValue = matchs2.join(""); 37 moreMatchs = matchValue.match(pattern2_2); 38 } else if (matchs3 != null) { 39 matchValue = matchs3.join(""); 40 moreMatchs = matchValue.match(pattern3_2); 41 } else if (matchs4 != null) { 42 matchValue = matchs4.join(""); 43 moreMatchs = matchValue.match(pattern4_2); 44 } else if (matchs5 != null) { 45 matchValue = matchs5.join(""); 46 moreMatchs = matchValue.match(pattern5_2); 47 } 48 console.log("matchValue: " + matchValue); 49 if (matchValue.length > 0) { 50 firstLine = firstLine.replace(matchValue, ""); 51 secondLine = matchValue; 52 if (moreMatchs != null) { 53 moreMatchValue = moreMatchs.join(""); 54 console.log("moreMatchValue: " + moreMatchValue); 55 if (matchValue !== moreMatchValue && (matchValue.length - moreMatchValue.length) > 2) { 56 firstLine = firstLine.replace(matchValue, ""); 57 firstLine = "" + firstLine + moreMatchValue; 58 secondLine = matchValue.replace(moreMatchValue, ""); 59 } 60 } 61 if (!secondLine.match("^(、|.|・|?|||ー|丁目|番地|号|-)")) { 62 newLines.push(firstLine); 63 newLines.push(secondLine); 64 } 65 } 66 if (newLines.length > 0) { 67 address.lines = newLines; 68 proposal.columns.push({ 69 paths: [ 70 { 71 key: "addresses", 72 index: addressIndex 73 }, { 74 key: "lines", 75 index: 0 76 } 77 ], 78 values: { 79 old: oldLines[0], 80 "new": newLines[0] 81 }, 82 matchs: [] 83 }); 84 proposal.columns.push({ 85 paths: [ 86 { 87 key: "addresses", 88 index: addressIndex 89 }, { 90 key: "lines", 91 index: 1 92 } 93 ], 94 values: { 95 old: oldLines[1], 96 "new": newLines[1] 97 }, 98 matchs: [] 99 }); 100 } 101// } 102}) 103console.log(proposal);

投稿2022/04/06 08:43

編集2022/04/06 09:17
Lhankor_Mhy

総合スコア36898

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

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

xlostdjx

2022/04/06 08:53

ご回答ありがとうございます。 説明不足で申し訳ございません。 こちらは表記ミスですので、関係無しと考えていただけると幸いです。
xlostdjx

2022/04/07 07:00 編集

追記ありがとうございます。 ご確認します。
xlostdjx

2022/04/07 09:01 編集

「北海道新市豊平区月寒西三条6丁目1-四十一707」 こちらで試していただけませんか? 「十」を加えた形だと、「707」で分割されるような気がします。。
Lhankor_Mhy

2022/04/07 09:35

そんな後出しをされても…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問