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/([^/]+)"