Javascriptの正規表現について
解決したいこと
javascriptを学習しているものです。
現在参考書にて、正規表現でURLを取得する事をしているのですが、
わからずに悩んでいる状況です。
問題の箇所
該当するソースコード
let p = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/g;
let str = "サポートサイトはhttp://www.wings.msn.to/です。";
let result = str.match(p);
for(let i=0; len=result.length; i<len; i++){
console.log(result[i]);
}
//結果
http://www.wings.msn.to/
undefined
msn.
/
確認したいこと
今回の出力結果のサブマッチ文字列、
http://www.wings.msn.to/
undefined
msn.
/
なのですが、この出力がそれぞれどの箇所に対応しているのかがわからない為、
確認したい所存でございます。
自分の認識としましては、
let p = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/g;
undefined // ⇨ (s)がない為
msn. // ⇨ ([\w-]+\.)の処理で、www.wings.msn.の最後のマッチ
/ // ⇨ (\/[\w- ./?%&=]*)? の箇所の丸カッコ()内の直前のスラッシュ
という風に認識しております。
また、変数pで宣言している正規表現において、一部何を表現しているのかが曖昧なので、そこもご教示頂けますと幸いでございます。
※現在自分は現在、下記のように解釈しております。
(説明が長くなっております。申し訳ありません)
//(本文)
let p = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*)?/g;
//(抜粋)
let p = /*http(s)?:\/\/*/([\w-]+\.)+/*[\w-]+(\/[\w- ./?%&=]*)?/g;*/
//問題箇所
①([\w-]+\.)+
1:[\w-]→対象は英数字、アンダーバー、ハイフン。[]があるので三種のいずれか1文字がマッチする。
2:その後に + があるので、英数字、アンダーバー、ハイフンでできた1文字以上の文字列がマッチするようになる。結果、www,wings,msnがマッチする。
3:その後に \. があるので、②の処理の後にピリオドがつく文字列がマッチする。
4:1〜3の処理が丸カッコ()で囲われていて、その後に + があるので、
英数字、アンダーバー、ハイフンでできている且つ、後にピリオドがつく1文字以上の文字列が1回以上マッチするようになる。
結果、www. , wings. , msn. の3つがこの①の文で全てマッチする。
//(抜粋)
let p = /*http(s)?:\/\/([\w-]+\.)+*/[\w-]+/*(\/[\w- ./?%&=]*)?/g;*/
//問題箇所
②[\w-]+
1:①の処理で末にピリオドが付かない文字列が出たので、②に移動。
ここでは、①の1、2同様、英数字、アンダーバー、ハイフンでできた1文字以上の文字列がマッチする。結果、toがマッチする。
//(抜粋)
let p = /*http(s)?:\/\/([\w-]+\.)+[\w-]+*/(\/[\w- ./?%&=]*)?/g;
//問題箇所
③(\/[\w- ./?%&=]*)?
1:②でマッチする文字がなくなったので、③に移動。まず初めにスラッシュがある。結果、toの後のスラッシュがここでマッチする。
2:スラッシュ以降では、英数字、アンダーバー、ハイフン、ピリオド、スラッシュ、?、%、&、=が対象。それが[]で囲まれているので、どれか1文字。その後に*があるので、0文字以上マッチする。
3:2の処理が丸カッコ()で囲われていて、その後に?があるので、スラッシュかつ、英数字、アンダーバー、ハイフン、スラッシュ、?、%、&、=のいずれか0文字以上の文字列を0もしくは1文字でマッチする。