当使用`.split`时,正则表达式捕获不存在的分组

时间:2014-08-25 17:49:51

标签: javascript regex

我尝试使用正则表达式拆分字符串。这是我到目前为止所做的事情:

'a.b.c.e[2].z'.split(/(?:\.)|\[(\d+)\]/g);

我得到了

的结果
["a", undefined, "b", undefined, "c", undefined, "e", "2", "", undefined, "z"]

我期待并希望得到

的结果
["a", undefined, "b", undefined, "c", undefined, "e", undefined, 2, undefined, "z"]

甚至:

["a", undefined, "b", undefined, "c", undefined, "e", "2", undefined, "z"]

我只是不想在结果列表中找到空字符串,除了手动删除它(我不能这样做,因为这是一个较大的正则表达式的一部分),有没有办法修改它正则表达式没有那个空字符串?

修改

我可能不清楚我正在尝试做什么,这是相关计划的片段:

var rawParts = path.split(/\.|\[(\d+)\]|\[(")((?:[^"]|(?:\\.))*)"\]|\[(')((?:[^']|(?:\\.))*)'\]/g);
var rawPart;
var parts = [];
var i, l;
for (i = 0, l = rawParts.length; i < l; i++) {
    rawPart = rawParts[i];
    if (rawPart !== undefined) {
        if (rawParts[i - 1] === '"') {
            rawPart = rawPart.replace(/\\"/g, '"');
        } else if (rawParts[i - 1] === "'") {
            rawPart = rawPart.replace(/\\'/g, "'");
        }
        parts.push(rawPart);
    }
}

我简化了上面的问题,但我想在我匹配[0]案例时删除空字符串。我无法删除所有空字符串,因为在a.b[''].c空格字符串有效的情况下

1 个答案:

答案 0 :(得分:0)

如果您尝试使用该字符串作为路径从对象获取密钥,我认为您会使事情变得复杂。您可以使用reducer执行此操作,并且知道括号表示法适用于两个数组对象,您必须将e[2]转换为e.2,然后缩小以解析路径。

var obj = {a: {b: {c: {e: [{},{},{z:'found'}]}}}}

var get = function(path, obj) {
  path = path.replace(/\[(.+?)\]/g, '.$1').split('.')
  return path.reduce(function(a, x){return a && a[x]}, obj)
}

get('a.b.c.e[2].z', obj) //=> found

如果找不到,您将获得undefined