JavaScriptの動かないコード(中級編) 正規表現の括弧キャプチャを,グローバルで繰り返しmatchできない (gオプションを付けると部分文字列の抽出が無効)
以下のJavaScriptコードが,意図した動作をしないのは,なぜですか。(制限時間1分)
やりたい事:
- (試行1)では,文字列からトップレベルドメインを1つだけ抽出する。
- これは上手くいく。
- (試行2)では,文字列からトップレベルドメインを全て抽出する。
- これは正常に動作しない。なぜなのか。
<script> // 元の文字列 var str = "URLは,http://a.com/ と,https://b.jp/ です。よろしくね。"; /* (試行1) 正規表現にgオプションを付けず, 情報を1個だけ抽出してみる。 */ // トップレベルドメインを抜き出す。 var m; m = str.match( new RegExp( "https?://[^\\/]+\\.([^\\.\\/]+)/" ) ); // httpとhttpsの両方に対応。 // ドメイン名の最後の部分だけを,カッコで抜き出す。 // つまり,ドメイン中の最後のドット以降の文字列を抜き出す。 // 配列の0番目には,マッチした文字列全体が入っている。 //alert( m[0] ); => "http://a.com/" // 配列の1番目には,括弧でキャプチャした部分が入っている。 alert( "トップレベルドメインは" + m[1] ); // => "com" /* (試行2) 正規表現にgオプションを付けて, マッチした情報を全て抽出してみる。 */ // 正規表現にgオプションを付ける。 m = str.match( new RegExp( "https?://[^\\/]+\\.([^\\.\\/]+)/", "g" ) ); // 括弧でキャプチャした部分を2つとも表示。 alert( "1つ目にマッチしたトップレベルドメインは" + m[1] ); alert( "2つ目にマッチしたトップレベルドメインは" + m[2] ); </script>