URLからurl、scheme、slash、host、port、path、query、hashを正規表現を使って抜き出す。
これはstring.match(regexp)とregexp.exec(string)を使用すると実現できる。
const whitespace = 1;
const parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
const url = "http://www.ora.com:80/goodparts?q#fragment";
const result = parse_url.exec(url);
const result2 = url.match(parse_url);
const names = ['url', 'scheme', 'slash', 'host', 'port', 'path', 'query', 'hash'];
let stringLengthMax = 0;
let buf = ' ';
let blanks = '';
for (let t = 0; t < names.length; t += 1) {
if(names[t].length > stringLengthMax){
stringLengthMax = names[t].length;
}
}
for (let t = 0; t < (stringLengthMax + whitespace); t += 1) {
blanks += buf;
}
console.log("blanks.length = " + blanks.length);
//stringLengthMaxをnames配列に格納された文字列の長さの最大長にしておく、
//これによりresult[t]を出す開始位置を揃えることができる。
//whitespace(>=0)でresult[t]の開始位置を調整する
for (let t = 0; t < names.length; t += 1) {
console.log(names[t] + ':' + blanks.slice(names[t].length) + result[t]);
}
console.log("-----");
//gフラグがない場合は
//string.match(regexp)の呼び出し結果はregexp.exec(string)と同じになる
for (let t = 0; t < names.length; t += 1) {
console.log(names[t] + ':' + blanks.slice(names[t].length) + result2[t]);
}
/*
blanks.length = 7
url: http://www.ora.com:80/goodparts?q#fragment
scheme: http
slash: //
host: www.ora.com
port: 80
path: goodparts
query: q
hash: fragment
-----
url: http://www.ora.com:80/goodparts?q#fragment
scheme: http
slash: //
host: www.ora.com
port: 80
path: goodparts
query: q
hash: fragment
*/
JavaScript:the good parts 「良いパーツ」によるベストプラクティス [ ダグラス・クロフォード ] ExternalLink P76~77、99