我做了这个正则表达式:/.net.(\w*)/
我正在尝试在这样的字符串中捕获qa
:
https://xxxxxx.cloudfront.net/qa/club/Slide1.PNG
我正在对.replace
location.replace(/.net.(\w*)/,data.newName));
但是,当我在Javascript中运行代码时,它捕获qa
而不是捕获.net
根据这个为ruby制作的在线正则表达式工具,它按预期捕获qa
http://rubular.com/r/ItrG7BRNRn
Javascript正则表达式和Ruby正则表达式之间的区别是什么,以及如何使我的正则表达式在javascript中按预期工作?
我将代码更改为:
var str = `https://xxxxxxxxxx.cloudfront.net/qa/club`;
var re = /\.net\/([^\/]*)\//;
console.log(data2.files[i].location.replace(re,'$1'+ "test"));
而不是
https://dm7svtk8jb00c.cloudfront.net/test/club
我明白了:
https://dm7svtk8jb00c.cloudfrontqatestclub
如果我移除了$1
我得到的https://dm7svtk8jb00c.cloudfronttestclub
更接近,但我想保留斜线。
答案 0 :(得分:2)
这将是一个更好的正则表达式:
/\.net\/([^\/]*)\//
请记住,.
将匹配任何字符,而不是句点字符。为此,您需要使用前导反斜杠来逃避它:\.
此外,\w
只会匹配数字,字母和下划线。你可以合理地在URL的那一部分中使用破折号。因此,你可以更好地匹配任何不是正斜杠的东西。
答案 1 :(得分:1)
你必须这样做:
location.replace(/(\.net.)(\w*)/, '$1' + data.newName)
replace
替换整个匹配的子字符串,而不是特定的组。 Ruby以完全相同的方式工作:
ruby -e "puts 'https://xxxxxx.cloudfront.net/qa/club/Slide1.PNG'.sub(/.net.(\w*)/, '@@')"
https://xxxxxx.cloudfront@@/club/Slide1.PNG
ruby -e "puts 'https://xxxxxx.cloudfront.net/qa/club/Slide1.PNG'.sub(/(.net.)(\w*)/, '\\1' + '@@')"
https://xxxxxx.cloudfront.net/@@/club/Slide1.PNG
答案 2 :(得分:1)
没有区别(至少与你提供的模式有关)。在这两种情况下,表达式匹配 ".net/qa"
,qa
是表达式中的第一个捕获组。请注意,即使在您的链接示例中,整个匹配也会突出显示。
我建议这样的事情:
location.replace(/(.net.)\w*/, "$1" + data.newName);
或者这个,更安全一点:
location.replace(/(.net.)\w*/, function(m, a) { return a + data.newName; });
答案 3 :(得分:1)
我不确定Ruby是如何工作的,但JavaScript替换不仅会替换捕获组,而是替换整个匹配的字符串。通过添加另一个捕获组,您可以使用$ 1添加回要保留的字符串。
...replace(/(.net.)(\w*)/,"$1" + data.newName");
答案 4 :(得分:1)
在JavaScript和Ruby的正则表达式实现之间并没有太大的不同,这是你的模式,需要一些工作。它不够紧张。
您可以使用/\.net\/([^\/]+)/
之类的内容,see in action at Rubular。
这将返回/
后面.net
分隔的字符。
正则表达式模式非常强大,但它们也充满了危险的副作用,容易打开大洞,导致误报,这可能会意外地破坏结果。在你熟悉它们之前,简单地开始,并以可想象的方式测试它们。而且,一旦你认为你很了解它们,就继续这样做;我工作的代码中的模式对我来说是一个特别的热门按钮,我总是在我们的代码评论中发现它们的漏洞并要求它们被收紧,直到它们完全符合开发人员的意思,而不是他们的想法他们的意思。
虽然上面的模式有效,但我可能在Ruby中做的有点不同。使用为工作制作的工具:
require 'uri'
URL = 'https://xxxxxx.cloudfront.net/qa/club/Slide1.PNG'
uri = URI.parse(URL)
path = uri.path # => "/qa/club/Slide1.PNG"
path.split('/')[1] # => "qa"
或者,更简洁:
URI.parse(URL).path.split('/')[1] # => "qa"