【问题标题】:Embed comments within JavaScript regex like in Perl在 JavaScript 正则表达式中嵌入注释,就像在 Perl 中一样
【发布时间】:2013-11-20 19:37:04
【问题描述】:

有没有办法在 JavaScript 正则表达式中嵌入注释,例如 you can do in Perl?我猜没有,但我的搜索没有找到任何说明您可以或不可以的内容。

【问题讨论】:

    标签: javascript regex comments


    【解决方案1】:

    您不能在正则表达式文字中嵌入注释。

    您可以在传递给 RegExp 构造函数的字符串构造中插入 cmets:

    var r = new RegExp(
        "\\b"   + // word boundary
        "A="    + // A=
        "(\\d+)"+ // what is captured : some digits
        "\\b"     // word boundary again
    , 'i');       // case insensitive
    

    但是正则表达式文字要方便得多(请注意我必须如何转义 \)我宁愿将正则表达式与 cmets 分开:只需将一些 cmets 放在您的正则表达式之前,而不是放在里面。

    EDIT 2018:这个问题和答案已经很老了。 EcmaScript 现在提供了新的方法来处理这个问题,更准确地说是template strings

    例如我现在在节点中使用this simple utility

    module.exports = function(tmpl){
        let [, source, flags] = tmpl.raw.toString()
        .replace(/\s*(\/\/.*)?$\s*/gm, "") // remove comments and spaces at both ends of lines
        .match(/^\/?(.*?)(?:\/(\w+))?$/); // extracts source and flags
        return new RegExp(source, flags);
    }
    

    这让我可以做thisthis 或这样的事情:

    const regex = rex`
        ^         // start of string
        [a-z]+    // some letters
        bla(\d+)
        $         // end
        /ig`;
    
    console.log(regex); // /^[a-z]+bla(\d+)$/ig
    console.log("Totobla58".match(regex)); // [ 'Totobla58' ]
    

    【讨论】:

    • 至于代码文档,这是个坏消息。我可能会在多行注释中“展开”文字正则表达式并解释它的部分。但是,一定不要忘记用表达式更新评论。文字也说明了它们的创建速度比通过 RegExp() 构造函数更快:jsperf.com/creating-regular-expressions/4
    【解决方案2】:

    现在有了the grave backticky things,你可以做一些内联的cmets。请注意,在下面的示例中,对匹配的字符串中不会出现的内容进行了一些假设,特别是关于空格。但我认为,如果您仔细编写process() 函数,您通常可以做出这样的有意假设。如果没有,可能有创造性的方法来定义正则表达式的小“迷你语言扩展”,以使其工作。

    function process() {
      var regex = new RegExp("\\s*([^#]*?)\\s*#.*$", "mg");
      var output = "";
      while ((result = regex.exec(arguments[0])) !== null ){
        output += result[1];
      }
      return output;
    }
    var a = new RegExp(process `
        ^f    # matches the first letter f
        .*   # matches stuff in the middle
        h    # matches the letter 'h'
    `);
    console.log(a);
    console.log(a.test("fish"));
    console.log(a.test("frog"));
    

    这里是a codepen.

    另外,对于 OP,只是因为我觉得有必要这么说,这很好,但如果您的结果代码与字符串连接一样冗长,或者您需要 6 个小时才能找出正确的正则表达式而且你是团队中唯一一个会费心使用它的人,也许你的时间有更好的用途......

    我希望你知道我对你只有这么直率because I value our friendship

    【讨论】:

    • 谢谢。花太多时间来完成这项工作确实是grave mistake
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2013-12-31
    • 2011-09-08
    • 1970-01-01
    • 2020-02-02
    • 1970-01-01
    • 2014-12-08
    • 2015-02-25
    相关资源
    最近更新 更多