String.replace与/和\在Nodejs不同于在Chrome中?

我试图在Nodejs中做一个路由器。 其中很大一部分是URI -> action ,所以我需要一个简单的可configuration的URI列表,并将它们正则expression为正则expression式以匹配请求URI。

简单! 我已经用PHP一百万次了。 给或拿。

所以这就是我所做的(testing):

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

我正在做的是1)转义/和2)用\d+replace#和3)用[^/]+replace*

在Chrome中,按预期工作:

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

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

在Nodejs中:

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

阙!? 每一个都被加倍逃脱? 我要么加倍逃脱/要么逃脱/

正则expression式是正确的,对吧?

我使用的是Chrome 15 dev(V8 javascript)和Node 0.5.8 dev(V8 javascript)。 这里发生了什么?

潜在的有趣
如果我testing/^\/users\/(\d+)\/status\/([^/]+)/.test('/users/1/status/x')它会在Chrome和Node中都返回true。

这是由于Node REPL与Chrome控制台的不同之处。 当你在Node中运行这个命令时,你会看到转义string(包括“不可见”转义字符),但是当你在Chrome中看到它时,它是被评估的实际string,转义字符被删除。 他们是相同的string,但Chrome试图为你“美化”它。

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

Chrome控制台:

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