スポンサーリンク

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>

発生する不具合

続きを読む