ruby正则表达式和javascript正则表达式之间的区别

时间:2014-01-15 19:11:08

标签: javascript ruby regex

我做了这个正则表达式:/.net.(\w*)/

我正在尝试在这样的字符串中捕获qahttps://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更接近,但我想保留斜线。

5 个答案:

答案 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"