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

时间:2011-09-23 20:38:04

标签: javascript regex node.js escaping read-eval-print-loop

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

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

所以这就是我做的(测试):

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

我正在做的是1)转义/和2)用#替换\d+并且3)用*替换[^/]+ < / p>

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

< \/users\/(d+)\/status\/([^/]+)

转义/并正确替换#*。这是V8。

在Nodejs中:

< \\/users\\/(d+)\\/status\\/([^/]+)

阙!?每个/都会被双重逃脱?我要么获得双重转义/,要么转未/

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

我正在使用Chrome 15 dev(V8 javascript)和Node 0.5.8 dev(V8 javascript)。这是怎么回事?

潜在的有趣
如果我测试/^\/users\/(\d+)\/status\/([^/]+)/.test('/users/1/status/x'),则会在Chrome和节点中返回true。

1 个答案:

答案 0 :(得分:5)

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

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

Chrome控制台:

> "\\/users\\/(d+)\\/status\\/([^/]+)"
"\/users\/(d+)\/status\/([^/]+)"
> "\/users\/(d+)\/status\/([^/]+)"
"/users/(d+)/status/([^/]+)"