javascriptのRegExpで取得した値からのswitch文の書き方を教えてください。


URLによって挙動を変えるswitch文を書きたく以下のコードで実行するのですが
http://example.com/abc100にアクセスしても、Defaultの結果「100」にしかなりません。

上述URLで「a」がアラート表示して欲しいのですが、こちらはどのように書いたらよいでしょうか?


if(location.href.match(new RegExp(/abc(\d{3}$)/))){

switch (RegExp.$1){

case 100:
window.alert("a");
break;
case 101:
window.alert("b");
break;
case 012:
window.alert("c");
break;
default:
window.alert(RegExp.$1);
}
}

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/03/21 03:55:28
  • 終了:2012/03/21 09:46:03

ベストアンサー

id:Cherenkov No.2

Cherenkov回答回数1502ベストアンサー獲得回数4922012/03/21 05:18:29

ポイント110pt

caseの箇所(数値だけなら回答1)と正規表現を修正。
location.hrefはリクエストURLによって最後にスラッシュが付くこともあるので注意。(abc100/ではなく確実にabc100を開くなら関係ないか。自分がハマったのはロケーションバーでco.jpと表示されているのに、location.hrefはco.jp/ だった。)
new RegExp()は文字列から正規表現オブジェクトを作る際に使いますが今回は必要ないと思います。

if (location.href.match(/abc(\d{3})\/?$/)) {
    switch (RegExp.$1) {
    case '100':
        window.alert("a");
        break;
    case '101':
        window.alert("b");
        break;
    case '012':
        window.alert("c");
        break;
    default:
        window.alert(RegExp.$1);
    }
}
id:pocon

ご回答ありがとうございます。
RegExp.$1はnew RegExp()じゃないといけないものだと思い込んでいました。
大変勉強になりました。、location.hrefの注意点もありがとうございます。(_ _)

2012/03/21 10:28:21

その他の回答(1件)

id:liml No.1

liml回答回数8ベストアンサー獲得回数32012/03/21 05:16:26

ポイント100pt

以下、IE9での動作確認になります。

以下の変更をすると「a」と表示されました。
 前:switch (RegExp.$1){
 後:switch ( parseInt(RegExp.$1) ){

解説をすると、RegExp.$1は文字型を返すようです。
switch文では等価演算子「===」により値と型が同じかを評価します。
つまり、一つ目のcase文では「100==="100"」という評価が行われ、
型が異なるためFalseとなります。
switch文 - 条件分岐 - JavaScript入門

文字列型から数値へ変換する関数「parseInt」により、
両者の型を合わせてあげるとうまくいきます。
parseInt関数 - グローバル関数 - JavaScript入門

javascriptでは型をあまり意識しないので、引っかかりやすいですね。

id:pocon

ご回答ありがとうございます。
書いて頂いたコードに修正したところ希望通りに動いてくれました。

2012/03/21 09:43:29
id:Cherenkov No.2

Cherenkov回答回数1502ベストアンサー獲得回数4922012/03/21 05:18:29ここでベストアンサー

ポイント110pt

caseの箇所(数値だけなら回答1)と正規表現を修正。
location.hrefはリクエストURLによって最後にスラッシュが付くこともあるので注意。(abc100/ではなく確実にabc100を開くなら関係ないか。自分がハマったのはロケーションバーでco.jpと表示されているのに、location.hrefはco.jp/ だった。)
new RegExp()は文字列から正規表現オブジェクトを作る際に使いますが今回は必要ないと思います。

if (location.href.match(/abc(\d{3})\/?$/)) {
    switch (RegExp.$1) {
    case '100':
        window.alert("a");
        break;
    case '101':
        window.alert("b");
        break;
    case '012':
        window.alert("c");
        break;
    default:
        window.alert(RegExp.$1);
    }
}
id:pocon

ご回答ありがとうございます。
RegExp.$1はnew RegExp()じゃないといけないものだと思い込んでいました。
大変勉強になりました。、location.hrefの注意点もありがとうございます。(_ _)

2012/03/21 10:28:21

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません