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

javascript正则表达式在表达式中插入新元素

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

    //** Incoming url's
    //** url e.g.   api/223344
    //**            api/11aa/page/2017
    
    //** Need to match to the following
    //** dir/api/12ab/page/1999
    //** Hence the need to add dir at the front
    
    var url = req.url;
    //** pass in: /^\/api\/([a-zA-Z0-9-_~ %]+)(?:\/page\/([a-zA-Z0-9-_~ %]+))?$/
    var re = myregex.toString();
    //** Insert dir into regex: /^dir\/api\/([a-zA-Z0-9-_~ %]+)(?:\/page\/([a-zA-Z0-9-_~ %]+))?$/
    var regVar = re.substr(0, 2) + 'dir' + re.substr(2);
    
    var matchedData = url.match(regVar);
    matchedData === null ? console.log('NO') : console.log('Yay');
    

    谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   Attila    7 年前

    我们来分解你的正则表达式

    ^\/api\/ 这与字符串的开头匹配,并且看起来与字符串“/api”完全匹配

    ([a-zA-Z0-9-_~ %]+) + 指示捕获1个或多个,例如,本节将匹配 abAB25-_ %

    (?:\/page\/([a-zA-Z0-9-_~ %]+)) 这也将多个令牌分组在一起,但不会像上面那样创建一个捕获组(即 ?:

    ?$ 在最后 ? 表示捕获0个或多个前向组,以及 $

    此正则表达式将匹配此字符串,例如: /api/abAB25-_ %/page/abAB25-_ %

    但是,您可以利用捕获组的优势,使用类似的方法来获得类似的结果: ^\/api\/([a-zA-Z0-9-_~ %]+)\/page\/\1?$ \1 引用第一个捕获组并完全匹配其匹配的令牌。编辑:实际上,这可能不起作用,因为/api/之后的文本和/page/之后的文本很可能会不同,继续。。。

    之后,您将在搜索开始处添加“dir”,因此现在可以匹配以下内容: dir/api/abAB25-_ %/page/abAB25-_ %

    您现在还将正则表达式转换为字符串,就像他们在评论中指出的那样,这将打破您预期的功能性。您可以使用 .source var matchedData = url.match(regVar.source); https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/source

    现在可以正确匹配如下字符串: dir/api/11aa/page/2017 请参见此示例: https://repl.it/Mj8h

        2
  •  0
  •   Michael Beeson    7 年前

    url.match(new RegExp(regVar, "i"));
    

    将字符串转换为正则表达式。“i”表示忽略情况;不知道这就是你想要的。在此处了解更多信息:

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp