ary を rst のように変換してみたいのです。
いろいろなアルゴリズム(アイディア)があったら教えてください。
できるなら、より洗練されたやつをお願いします。
let ary = [
'',
'1 丁目',
'1 丁目 2 番地',
'1 丁目 2 番地 3 号',
' 1丁目 ',
' 1丁目 2 番地 ',
' 1丁目2番地 3 ',
'1',
'1-2',
'1-2-3',
'2 番地', // ×
'2 番地 3 号', // ×
'-2-3'// ×
];
let rst = [
[1],
[1,2],
[1,2,3],
[1],
[1,2],
[1,2,3],
[1],
[1,2],
[1,2,3]
];
No.1ベストアンサー
- 回答日時:
洗練された、というのがどういう意味か不明ですが
こういうのは地道にやっていく方が、メンテナンス性も上がって良いと思います。
空の配列rstを用意
aryの各文字列について以下を実施
1.「番地」が含まれている、かつ、「丁目」が含まれていない場合はエラー
2. 文字の置換
2-1 ' '(空白)を''(空文字)に置換 // 空白の削除
2-2 '丁目' と '番地'を '-' に置換
2-3 '号' を''(空文字)に置換 // '号'の削除
3. 分割
3-1 2.でできた文字列の最初が '-' ならエラー // '-2-3'の場合
3-2 文字列を'-'で分割(split)して配列にする
4. 数値化
配列の各要素を文字列から数値に変換する
5. 生成された配列をrstに追加(push)する(エラーだった場合は何もしない)
回答、有難うございます。手順を追って作ってみました。(正規表現不使用)
「文字列の最後が "-" になる場合、それを削除する。」が分割の前に必要でした
>>>洗練された
単純なショートコーディングではなく、ロジックのショートコーディングみたいな?
let rst = [ ];
for (let t of ary) {
try {
if ('' === t)
throw new Error;
if (-1 < t.indexOf ('番地'))
if (-1 === t.indexOf ('丁目'))
throw new Error;
t = t.split (' ').join ('');
t = t.split ('丁目').join ('-');
t = t.split ('番地').join ('-');
t = t.split ('号').join ('');
if (0 === t.indexOf ('-'))
throw new Error;
//ここ3行追加
let last = t.length - 1;
if (t.lastIndexOf('-') === last)
t = t.substr (0, last);
let tmp = t.split ('-');
tmp = tmp.map (a => parseInt (a, 10));
rst.push (tmp);
}
catch (err) {
;
}
}
console.log (rst);
No.3
- 回答日時:
例えばこう
<script>
var a=[
'',
'1 丁目',
'1 丁目 2 番地',
'1 丁目 2 番地 3 号',
' 1丁目 ',
' 1丁目 2 番地 ',
' 1丁目2番地 3 ',
'1',
'1-2',
'1-2-3',
'2 番地', // ×
'2 番地 3 号', // ×
'-2-3'// ×
];
var reg=new RegExp('^\\d+(-\\d+){0,2}$|^\\d+丁目((\\d+番地)+(\\d+号*)*)*$');
for(var i=0;i<a.length;i++){
console.log(a[i]+(a[i].replace(/\s/g,"").match(reg)?"ok":"ng"))
}
</script>
まずは整合性のチェックだけする。あとはこれにマッチした場合数値だけ抜き出せばOK
<script>
var a=[
'',
'1 丁目',
'1 丁目 2 番地',
'1 丁目 2 番地 3 号',
' 1丁目 ',
' 1丁目 2 番地 ',
' 1丁目2番地 3 ',
'1',
'1-2',
'1-2-3',
'2 番地', // ×
'2 番地 3 号', // ×
'-2-3'// ×
];
var reg=new RegExp('^\\d+(-\\d+){0,2}$|^\\d+丁目((\\d+番地)+(\\d+号*)*)*$');
var b=a.map(function(x){
return x.replace(/\s/g,"").match(reg)?x.match(/\d+/g):null;
}).filter(function(x){
return x!=null;
});
console.log(b);
</script>
回答、有難うございます。
問いの例題に "1丁目2-3"を加えるべきでした。
最近、作るまでのコスト、動かしているときのコスト、メンテナンスせざるを得ないときのコストを考えるようにもなりました。(波型インデントにコストをかけているのでは?という突っ込みは無しで)
回答頂いた例は、正規表現を使って整形をし、パターンを調べ、抽出をしています。(三回も!)
正直に言えば一回で可能ですよね。^^;
ところで、普段の回答ではどこにコストをかけます?
/^\s*(\d+)(?:\s*(?:丁目|\-)(?:\s*(\d+)(?:\s*(?:番地|\-)(?:\s*(\d+)(?:\s*号?)?)?)?)?)?\s*$/.exec (str);
つまり、
console.log (
ary.map (a => /^\s*(\d+)(?:\s*(?:丁目|\-)(?:\s*(\d+)(?:\s*(?:番地|\-)(?:\s*(\d+)(?:\s*号?)?)?)?)?)?\s*$/.exec (a))
.filter (a => !! a)
.map (([,...a]) => a.filter (a => !! a).map (a => parseInt (a, 10)))
);
No.5
- 回答日時:
No.1です。
一つ処理が抜けていて失礼いたしました。やはり実際に動作させてみないと漏れがでますね。
私はJavaScriptのコードはあまり詳しくないのですが回答いただいたコードで気になった点です。
・try~catch~とthrow new Error;の部分は単純に (for に対する) continue方が良くないでしょうか?
(最初の回答でエラーと書いてしまったのが良くなかったです)
・置換はreplaceを使用したほうが分かりやすいのではないでしょうか?
意図があって、その様にされているのでしたら申し訳ありません。
>一つ処理が抜けていて
問題なしですよ!私の回答するときなどは、そりゃぁ〜もう抜けまくってますから。
もしこれからの人がロジックを見たときに、理解しやすいようにしました。
(それにちょっと「できる奴!」に見えるから)
>置換はreplaceを使用したほうが分かりやすい
確かにそうですね。半角空白を置き換えるときに、/¥s/g だと正規表現を使うことになります。
それが嫌でした。(なんとか使わない方向で)
JSの置き換えは、第1引数が文字列の場合1回だけしか行われません。その対策が面倒です。
(それにちょっと「できる奴!」に見えるから)
ついつい正規表現に頼ってしまいがちですね。
面倒なくらい長い正規表現を書いておきながなんですけどね。
(それはちょっと「できる奴!」に見えるから)
ありがとうございました。
No.6
- 回答日時:
#4です、解決していたわけではないのですね
<script>
var a=[
'2丁目3',//OK
'3丁目4-5',//OK
'4丁目5-6号',//これが通っちゃいます、抜きますか?
'5-6番地', //NG
'',
'1 丁目',
'1 丁目 2 番地',
'1 丁目 2 番地 3 号',
' 1丁目 ',
' 1丁目 2 番地 ',
' 1丁目2番地 3 ',
'1',
'1-2',
'1-2-3',
'2 番地', // ×
'2 番地 3 号', // ×
'-2-3',// ×
];
var reg=new RegExp('^\\d+(-\\d+){0,2}$|^\\d+丁目((\\d+(番地|-)*)+(\\d+号*)*)*$');
var b=a.map(function(x){
return x.replace(/\s/g,"").match(reg)?x.match(/\d+/g):null;
}).filter(function(x){
return x!=null;
});
console.log(b);
</script>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【Excel】住所に郵便番号を付記する方法 3 2022/05/07 17:15
- Visual Basic(VBA) EXCEL VBAで教えてください。 1 2022/12/22 04:20
- Java Java 南京錠 2 2023/02/04 11:46
- Excel(エクセル) Excelの列から検索して該当する行を別シートに転記するVBA 2 2022/12/20 09:35
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- 数学 数学A、確率の問題です。 nを4以上の自然数とする。数字の1からnが書かれたカードが1枚ずつ、合計n 3 2023/07/02 22:54
- Visual Basic(VBA) 順列をランダムに発生するプログラム 1 2022/11/16 12:16
- 相続・遺言 自筆遺言書における不動産の表示の仕方 2 2022/04/19 10:43
- Excel(エクセル) 列を自動で追加したい 3 2022/07/11 12:58
- その他(暮らし・生活・行事) マイナンバーカードの住所表示について 9 2022/10/02 13:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
C#テキストボックスの文字を配...
-
undefinedを表示させない方法は...
-
JavaScriptでの動的な多次元配...
-
WSH(Jscript)でファイル一覧
-
javascript 変数名の連結をしたい
-
javascriptで行を抽出したいです。
-
1から20までの整数から、重複な...
-
React hooksが値を返して配列変...
-
gas 配列
-
JavaScriptで二次元配列?
-
<a>タグのテキストを取得
-
JavaScriptで文字列の特定文字...
-
javascriptとphpの連携で疑問
-
Latexに関する質問です。
-
window.openでタイトル名の指定
-
Boolean型配列中のTrueの有無を...
-
ActiveXobjectが作成できない
-
翌月を取得するGASが分かりません
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
二次元配列を使って順位をだす...
-
C#テキストボックスの文字を配...
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
React hooksが値を返して配列変...
-
undefinedを表示させない方法は...
-
javascriptで行を抽出したいです。
-
二次元配列の全要素の全要素を...
-
JavaScriptにおける[] とか :...
-
JavaScriptでの動的な多次元配...
-
順列生成アルゴリズムについて...
-
WSH(Jscript)でファイル一覧
-
JavaScriptからPHPに配列を渡す...
-
javascriptからphpに配列データ...
-
多次元配列から最大値を1行また...
-
textareaに入力されたデータを...
-
どうすればresponseText結果を...
-
オブジェクトから任意のプロパ...
-
フォーム入力値の重複チェック
おすすめ情報