【问题标题】:difference between ruby regex and javascript regexruby 正则表达式和 javascript 正则表达式之间的区别
【发布时间】:2023-04-07 23:21:01
【问题描述】:

我做了这个正则表达式:/.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,它更接近,但我想保留斜线。

【问题讨论】:

  • 您希望结果在 Ruby 中运行,还是在 JavaScript 中运行? location 可以是任何一种语言的变量。
  • @theTinMan Javascript,对不起
  • 顺便说一句,如果你想在 JavaScript 中测试正则表达式,我推荐 regexpal.com 或者只使用浏览器的控制台。

标签: javascript ruby regex


【解决方案1】:

这将是一个更好的正则表达式:

/\.net\/([^\/]*)\//

请记住,. 将匹配任何字符,而不是句点字符。为此,您需要使用前导反斜杠对其进行转义:\.

另外,\w 只会匹配数字、字母和下划线。你可以在 URL 的那部分有一个破折号。因此,最好匹配不是正斜杠的任何内容。

【讨论】:

  • 我将我的正则表达式更改为您提供的那个,但它似乎从我的字符串中删除了 / 字符。我想保留那些
【解决方案2】:

我不确定 Ruby 是如何工作的,但 JavaScript 替换不仅会替换捕获组,还会替换整个匹配的字符串。通过添加另一个捕获组,您可以使用 $1 重新添加要保留的字符串。

...replace(/(.net.)(\w*)/,"$1" + data.newName");

【讨论】:

  • 我将我的正则表达式更改为 Jon 建议的那个,并且移动捕获组进行了一些小的更改,但我没有得到我想要的结果
  • 好吧,Jon 只有一个捕获组围绕您要删除的内容,所以它当然不起作用。
  • 我在(\.net\/) 周围创建了另一个捕获组,并且成功了。我觉得我不太喜欢捕获组。
  • 我实际上问错了问题。我实际上想进一步捕获一个级别,所以club,而不是qa
【解决方案3】:

你必须这样做:

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

【讨论】:

    【解决方案4】:

    没有区别(至少对于您提供的模式)。在这两种情况下,表达式匹配".net/qa"qa 是表达式中的第一个捕获组。请注意,即使在您的链接示例中,整个匹配项也会突出显示。

    我会推荐这样的东西:

    location.replace(/(.net.)\w*/, "$1" + data.newName);
    

    或者这样,更安全一点:

    location.replace(/(.net.)\w*/, function(m, a) { return a + data.newName; });
    

    【讨论】:

      【解决方案5】:

      在 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"
      

      【讨论】:

        猜你喜欢
        • 2016-11-18
        • 2012-02-22
        • 1970-01-01
        • 2012-06-01
        • 2013-09-18
        • 2016-03-12
        • 1970-01-01
        • 2010-10-09
        相关资源
        最近更新 更多