Node.replace与Node中的/和\不同于Chrome?

Rud*_*die 4 javascript regex escaping node.js read-eval-print-loop

我正在尝试在Nodejs中制作路由器.其中很大一部分是URI -> action,所以我需要一个简单的可配置URI列表,并将它们重新定位到regexp以匹配请求URI.

简单!我用PHP做了一百万次.给予或接受.

这就是我做的(测试):

> uri = '/users/#/status/*'
> uri.replace(/\//g, '\\/').replace(/#/g, '(\d+)').replace(/\*/g, '([^/]+)')
Run Code Online (Sandbox Code Playgroud)

我正在做的是1)逃避/和2)替换#为a \d+和3)替换*[^/]+

在Chrome中,这可以按预期工作:

< \/users\/(d+)\/status\/([^/]+)
Run Code Online (Sandbox Code Playgroud)

逃脱/并更换#*正确.这是V8.

在Nodejs中:

< \\/users\\/(d+)\\/status\\/([^/]+)
Run Code Online (Sandbox Code Playgroud)

阙!?每个/都是双重逃脱?我要么得到双重逃脱,/要么没有逃脱/.

正则表达式是对的,对吗?

我正在使用Chrome 15 dev(V8 javascript)和Node 0.5.8 dev(V8 javascript).这里发生了什么?

可能有趣
如果我测试/^\/users\/(\d+)\/status\/([^/]+)/.test('/users/1/status/x')它在Chrome和Node中都返回true.

小智 5

这是由于Node REPL与Chrome控制台的不同之处.当您在Node中运行命令时,您将看到转义字符串(包括"隐形"转义字符),但是当您在Chrome中看到它时,它是已评估的实际字符串,并删除了转义字符.它们是相同的字符串,但Chrome正试图为你"美化"它.

实际上,如果您将从Node获得的字符串复制并粘贴到Chrome(甚至是FF Firebug)控制台中,您将获得一个包含单个转义符的字符串.如果您再次复制并粘贴它,它将删除下一级别的转义字符.

Chrome控制台:

> "\\/users\\/(d+)\\/status\\/([^/]+)"
"\/users\/(d+)\/status\/([^/]+)"
> "\/users\/(d+)\/status\/([^/]+)"
"/users/(d+)/status/([^/]+)"
Run Code Online (Sandbox Code Playgroud)