Javascript 存储在变量中的正则表达式在匹配时不起作用

Javascript 存储在变量中的正则表达式在匹配时不起作用,javascript,jquery,ruby-on-rails,regex,ruby,Javascript,Jquery,Ruby On Rails,Regex,Ruby,我有一个散列的“允许链接”在我的rails后端上呈现,类似这样 ALLOWED_URLS = { "vimeo": { :regex => "/https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/", }, "yo

我有一个散列的“允许链接”在我的rails后端上呈现,类似这样

    ALLOWED_URLS = {
      "vimeo": {
          :regex => "/https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/",
},
      "youtube": {
          :regex => "/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/",
    }
在每个存储值中,如果链接来自youtube或Vimeo,我都有一个正则表达式可以尝试,并且视频id我已经尝试了这两种方法,它们工作得非常好

但当我将该变量传递给我的CoffeeScript并将其转换为JSON时,正则表达式不起作用,因为它带有引号,如下所示:

"/https?://(?:www.|player.)?vimeo.com/(?:channels/(?:w+/)?|groups/([^/]*)/videos/|album/(d+)/video/|video/|)(d+)(?:$|/|?)/"
当我尝试测试它时,这个错误会显示出来

未捕获的语法错误:无效的正则表达式://https?:/(?:www.| player.)?vimeo.com/(?:channels/(?:w+/)?| groups/([^/]*)/视频/|相册/(d+)/视频/|视频/|)(d+)($:/|?)/:无需重复 在String.matc

我曾尝试将不带引号的正则表达式放在后端,但结果是一样的


我能做什么???

这里有两个独立的问题:

  • 转义将是一场噩梦,因为每个人(Ruby、(Java | Coffee)脚本、正则表达式)都想使用
    \
    作为转义字符
  • 将动态字符串转换为(Java | Coffee)脚本regex
  • 第(2)部分非常简单,将正则表达式转换为JavaScript字符串,然后在JavaScript中使用正则表达式构造函数:

    # In your CoffeeScript...
    str = '^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*'
    re  = new RegExp(str)
    
    <script type="text/javascript">
      let str = <%= ALLOWED_URLS[:youtube][:regex].to_json %>;
      let re  = new RegExp(str);
    </script>
    
    因此,现在您需要将此字符串输入到您的咖啡脚本中:

    '^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*'
    
    用Ruby构建字符串(使用单引号减少转义,不包括开头和结尾的斜杠):

    然后您可以使用
    来_json
    进入JavaScript:

    # In your CoffeeScript...
    str = '^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*'
    re  = new RegExp(str)
    
    <script type="text/javascript">
      let str = <%= ALLOWED_URLS[:youtube][:regex].to_json %>;
      let re  = new RegExp(str);
    </script>
    

    在JavaScript中。

    将其存储为字符串文字,并进行适当的反斜杠转义,然后在初始化正则表达式对象时使用正则表达式构造函数。@WiktorStribiżew我不知道如何做,请给我举个例子好吗?或者更好,将它们存储为正则表达式文字:
    regex://^.*(youtu.be\/|v\/|u\/\w\/| embed\/|……///code>(即,删除环绕引号)。@muistooshort对我不起作用,如果我尝试在没有.to_json的情况下访问它,我会得到一个“missing/(unclosed regex)”错误,我想问题是我在使用。to_json,但我不知道抱歉,错过了CoffeeScript部分。为什么不先用CoffeeScript编写它们呢?Ruby和JavaScript正则表达式是不同的。天哪,谢谢!你是个天才!非常感谢!再次感谢你,我刚刚完成任务,你是我的英雄!