Javascript 使用“.split”时捕获不存在分组的正则表达式`

Javascript 使用“.split”时捕获不存在分组的正则表达式`,javascript,regex,Javascript,Regex,我正在尝试使用正则表达式拆分字符串。以下是我目前正在做的事情: 'a.b.c.e[2].z'.split(/(?:\.)|\[(\d+)\]/g); 我得到一个结果 ["a", undefined, "b", undefined, "c", undefined, "e", "2", "", undefined, "z"] ["a",

我正在尝试使用正则表达式拆分字符串。以下是我目前正在做的事情:

'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"]
["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中,空字符串是有效的

< p>如果你试图从使用字符串的对象中获取一个键作为路径,我想你会把事情复杂化。您可以使用reducer实现这一点,并且知道括号表示法适用于数组和对象,因此必须将e[2]转换为e.2,然后使用reduce解析路径

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

如果找不到,您将无法定义。

听起来像是XY问题。你为什么首先要用正则表达式解析它?@elclars我正在创建一个嵌套对象,比如getobj,'foo[4].bar'在.split中非捕获组和捕获组有什么意义?这是一个更大的正则表达式的一部分,它也解析[foo]和['foo']符号,还接受[foo\2]和[foo.2]因此,像这样更改实现并不是一件简单的事情。您的问题不是很清楚,因为这与您在对象上的字符串有关,如所示。尝试发布一个真实世界的例子,包括输入和输出,以及您期望的内容。问regex是个错误的问题。询问你的实际问题,这就是我认为你面临XY问题的原因。我对问题进行了编辑,以便更好地解释我面临的问题