代码之家  ›  专栏  ›  技术社区  ›  vitaly-t

连接两个正则表达式,以支持嵌套引号

  •  0
  • vitaly-t  · 技术社区  · 4 年前

    我尝试实现一个属性路径规范化器,这样以后可以快速计算结果。

    以下是我的初步实现:

    function normalize(path: string): (string | number)[] {
        const res = [], reg = /\[\s*(\d+)|["']([^"']+)["']\s*]|[a-z_$0-9]+/gi;
        let a;
        while (a = reg.exec(path)) {
            res.push(a[1] ? parseInt(a[1]) : a[3] || a[2] || a[0]);
        }
        return res;
    }
    

    它可以接受如下输入: first.a.b[123].c['prop1'].d["prop2"].last ,并生成以下快速分辨率阵列:

    ['first', 'a', 'b', 123, 'c', 'prop1', 'd', 'prop2', 'last']
    

    ' " ,对于这样的输入: first["a\'b"].second['"'] .

    更确切地说,我不知道如何采取其中一种解决办法 here ,并将它们注入我的正则表达式中。这些解决方案本身工作得很好,只是不是作为我自己正则表达式的一部分,所以将两个表达式合并为一个是我一直面临的问题。

    1 回复  |  直到 4 年前
        1
  •  2
  •   CertainPerformance    4 年前

    匹配并捕获字符集引号。然后你可以重复任何字符 但是 捕获的引号在量词中具有负前瞻性,然后再次匹配引号:

    function normalize(path) {
        const res = [], reg = /\[\s*(\d+)|(["'])((?:(?!\2).)+)\2\s*]|[\w$]+/gi;
        let a;
        while (a = reg.exec(path)) {
            res.push(a[1] ? parseInt(a[1]) : a[3] || a[0]);
        }
        return res;
    }
    console.log(normalize(`first.a.b[123].c['prop1'].d["prop2"].last`));
    console.log(normalize(`first["a\'b"].second['"']`));

    Acorn 如果可能的话。