代码之家  ›  专栏  ›  技术社区  ›  Mittenchops

未捕获捕获组的节点uri正则表达式

  •  0
  • Mittenchops  · 技术社区  · 7 年前

    我知道stackoverflow上有10亿个正则表达式问题,但我不明白为什么我的uri匹配器不能在node中工作。

    我有以下几点:

    var uri = "file:tmp.db?mode=ro"
    
    function parseuri2db(uri){
        var regex = new RegExp("(?:file:)(.*)(?:\\?.*)");
        let dbname = uri.match(regex)
        return dbname
    }
    

    我试图只识别数据库名称,我希望它是:

    1. 在一次不被接受的经历之后 file:
    2. 在选修课之前 ? +参数设置为字符串的结尾。

    当我使用:

    var regex1 = new RegExp("(?:file:)(.*)(?:\\?.*)");
    

    我觉得答案其实更像:

    var regex2 = new RegExp("(?:file:)(.*)(?:\\??.*)");
    

    使用0或1 ? 表上的量词 \\? 字面意义的但后者失败了。

    总之,我的结果是:

    console.log(parseuri2db(conf.db_in.filename))
    
    [ 'file:tmp.db?mode=ro',
      'tmp.db',
      index: 0,
      input: 'file:tmp.db?mode=ro' ]
    

    这似乎是在第一个参数中捕获整个字符串,而不仅仅是我要求的单个捕获组。

    我的问题是:

    1. 我有什么错,我得到了多个捕获?
    2. 我该如何重新措辞,以使用名称捕获我的捕获组?

    I expected 类似以下内容的工作(2):

    function parseuri2db(uri){
      // var regex = new RegExp("(?:file:)(.*)(?:\\?.*)");
      // let dbname = uri.match(regex)
      var regex = new RegExp("(?<protocol>file:)(?<fname>.*)(<params>\\?.*)");
      let [, protocol, fname, params] = uri.match(regex)
      return dbname
      }
      console.log(parseuri2db(conf.db_in.filename))
    

    但是:

      SyntaxError: Invalid regular expression: /(?<protocol>file:)(?<fname>.*)(<params>\?.*)/: Invalid group
    

    更新1

    我的第一个问题的答案是,我不需要捕捉 ? 第二个捕获组中的文本:

    "(?:file:)([^?]*)(?:\\??.*)"
    
    0 回复  |  直到 7 年前
        1
  •  0
  •   Mittenchops    7 年前

    该特定节点正则表达式库不支持组。