我尝试使用正则表达式拆分字符串。这是我到目前为止所做的事情:
'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
空格字符串有效的情况下
答案 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
。