小ネタ:文字列#replaceで簡易パースは便利だけどどうもね。
string#replace関数に、関数が渡せることをご存知でしょうか?
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/String/replace
function replacer(str, p1, p2, offset, s) { return str + " - " + p1 + " , " + p2; } var newString = "XXzzzz".replace(/(X*)(z*)/, replacer);
returnで返した文字列に置換されるというものですが、これを使って簡易パーサーを書くことが出来ます。
var str = 'banana,apple,orange', vals = []; str.replace(/[^,]+/g, function(s) { vals.push(s); }); console.log(vals); // ['banana', 'apple', 'orange'];
割と使われてる小技だけど、変態っぽいし「replace」って名前が気になるしそもそも内部で無駄な処理が走ってるはず。
なんで真面目にRegExp#execを使って頑張ってみる。
https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/RegExp/exec
var str = 'banana,apple,orange', vals = []; (function() { var r = /[^.]+/g, match; while ((match = r.exec(str)) != null) { vals.push(match[0]); } }})(); console.log(vals); // ['banana', 'apple', 'orange'];
名前空間を汚さないように関数でくくるため、長くなる。くくらなくても1行長い。
しかも、string#replaceでパースする場合、以下のような見やすい書き方が出来る。
var str = '12:15-13:40', start, end; str.replace(/(\d+:\d+)-(\d+:\d+)/g, function(s, hm1, hm2) { start = hm1; end = hm2; }); console.log(start, end); // 12:15, 13:40
分かりやすいですよね。
しかし、同じ動きをする関数をexecで作るのがベターだとは思う。