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.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>
No.5
- 回答日時:
No.1です。
一つ処理が抜けていて失礼いたしました。やはり実際に動作させてみないと漏れがでますね。
私はJavaScriptのコードはあまり詳しくないのですが回答いただいたコードで気になった点です。
・try~catch~とthrow new Error;の部分は単純に (for に対する) continue方が良くないでしょうか?
(最初の回答でエラーと書いてしまったのが良くなかったです)
・置換はreplaceを使用したほうが分かりやすいのではないでしょうか?
意図があって、その様にされているのでしたら申し訳ありません。
>一つ処理が抜けていて
問題なしですよ!私の回答するときなどは、そりゃぁ〜もう抜けまくってますから。
もしこれからの人がロジックを見たときに、理解しやすいようにしました。
(それにちょっと「できる奴!」に見えるから)
>置換はreplaceを使用したほうが分かりやすい
確かにそうですね。半角空白を置き換えるときに、/¥s/g だと正規表現を使うことになります。
それが嫌でした。(なんとか使わない方向で)
JSの置き換えは、第1引数が文字列の場合1回だけしか行われません。その対策が面倒です。
(それにちょっと「できる奴!」に見えるから)
ついつい正規表現に頼ってしまいがちですね。
面倒なくらい長い正規表現を書いておきながなんですけどね。
(それはちょっと「できる奴!」に見えるから)
ありがとうございました。
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)))
);
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
for文内での計算の仕方
-
undefinedを表示させない方法は...
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
HTMLで誕生石と星座をアラート...
-
Javaについて質問です。 要素数...
-
javascript二次元配列
-
Wikipedia APIの結果からタイト...
-
ASP+アクセスでのSQLコメントに...
-
parseIntで戻り値がNaNになるの...
-
問題はbind の付いたリスナーを...
-
バイナリファイルから文字列を...
-
ジェネレーターの作り方
-
functionから別のfunctionを実...
-
ローカルにあるファイルを検索...
-
任意の座標をクリックさせるには
-
JavaScriptを使って毎日決まっ...
-
jQuery 同じ処理を関数にまとめ...
-
C#OpenCv V4にのエラーに関する...
-
「今日の日付けを画像で表示」...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
C#テキストボックスの文字を配...
-
二次元配列を使って順位をだす...
-
undefinedを表示させない方法は...
-
javascript 変数名の連結をしたい
-
javascriptで行を抽出したいです。
-
javascriptで入力フォームに日...
-
JavaScriptにおける[] とか :...
-
Perlの配列をJavaScriptに渡せ...
-
HTMLで誕生石と星座をアラート...
-
フォーム入力値の重複チェック
-
WSH(Jscript)でファイル一覧
-
[JS] setAttributeで保存される...
-
オブジェクトから任意のプロパ...
-
読み込んだテキストファイルの...
-
この配列は何?
-
順列生成アルゴリズムについて...
-
textareaに入力されたデータを...
-
JavaScriptからPHPに配列を渡す...
おすすめ情報