JavaScriptの動かないコード(中級編)正規表現をwhile内で定義すると無限ループで固まるエラー (execでグローバルなマッチだと,処理がフリーズ)
以下のJavaScriptコードが,意図した動作をしないのは,なぜですか。(制限時間1分)
やりたい事:
- 複数の文字列がある。
- それぞれの文字列から,URLのトップレベルドメイン(TLD)を全て抜き出す。
- 抽出のために,RegExp.exec() メソッドで,正規表現にグローバルオプションを付けて実行する。
<script> // 検索対象の文字列たち var strs = [ "URLは,http://a.com/ と,https://b.jp/ です。よろしくね。", "どうぞhttp://c.com/においで下さい。", "http://d.jp/ から移転しました。こちら→https://e.info/ " ]; /* マッチするすべてのTLDを列挙 */ // 検索対象のすべての文字列を,順番に検査する。 for( var i = 0; i < strs.length; i ++ ){ // この一つの文字列の中に含まれる // 全てのTLDを抽出。 var str = strs[i]; // execメソッドが値を返し続ける限り, // whileでループを回し続ける。 var arr; while( ( // execの結果は毎回,配列として受け取る。 arr = ( // 正規表現にgオプションを付け, // 文字列内で複数回マッチさせる。 /https?:\/\/[^\/]+\.([^\.\/]+)/g ).exec( str ) ) != null ){ // 括弧でキャプチャした文字列を表示 alert( "トップレベルドメインは" + arr[1] ); } } </script>