为什么不将regexp用作对象键匹配?

时间:2015-11-03 10:04:38

标签: javascript regex

代码非常明显。为什么它直接匹配,而不是通过for..in引入?



// just for snippet
function print(x) { document.write(x + "<br>\n"); }

var routes = { };
routes[/[0-9]+/] = function(x) { print("number(" + x + ")"); }

function handle(x) { 
    for (var r in routes) {
        print("trying " + r + " on " + x);
        if (x.match(r)) {
            print("hit");
            return routes[r](x);
        }
    }
}

handle("test");
handle("5");

// however
print("5".match(/[0-9]+/));
&#13;
&#13;
&#13;

我认为是因为for..in转换为String,但根据MDN docs on match

  

regexp :正则表达式对象。如果传递了非RegExp对象obj,则使用new RegExp(obj)将其隐式转换为RegExp。

修改 似乎

"5".match("/[0-9]+/")

不起作用。我想我已经接近自己解决它,但我仍然喜欢外部输入的内部机制。

1 个答案:

答案 0 :(得分:1)

当您传递RegExp文字时,两端的/也包含在字符串中。这就是他们不匹配的原因。

例如,

console.log(new RegExp("/[0-9]+/"))
/\/[0-9]+\//

正如您在上面显示的示例中看到的那样,/也会被转义并作为正则表达式的一部分包含在内。