代码非常明显。为什么它直接匹配,而不是通过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;
我认为是因为for..in
转换为String
,但根据MDN docs on match
:
regexp :正则表达式对象。如果传递了非RegExp对象obj,则使用
new RegExp(obj)
将其隐式转换为RegExp。
修改 似乎
"5".match("/[0-9]+/")
不起作用。我想我已经接近自己解决它,但我仍然喜欢外部输入的内部机制。
答案 0 :(得分:1)
当您传递RegExp文字时,两端的/
也包含在字符串中。这就是他们不匹配的原因。
例如,
console.log(new RegExp("/[0-9]+/"))
/\/[0-9]+\//
正如您在上面显示的示例中看到的那样,/
也会被转义并作为正则表达式的一部分包含在内。