3

我如何获得这样的数组

[
    0: [ "first", "value", "1" ],
    1: [ "second", "value", "2" ],
    2: [ "third", "value", "3" ]
]

甚至更好

[ "first", "value", "1", "second", "value", "2", "third", "value", "3" ]

从字符串

"first.value[1].second.value[2].third.value[3]"

依靠单个RegEx.exec()运行?

我试过这个:

regex = /\.*([\w]+)\.([\w]+)\[([\d]*)\]/g;
var str = "first.value[1].second.value[2].third.value[3]";
result = regex.exec(str);

但我无法获得子捕获组(如第一个示例)。

PS - 我想为两种类型的结果(平面数组嵌套数组)获取正则表达式

4

5 回答 5

3

如果编辑的结果是你所追求的

[“第一”、“值”、“1”、“第二”、“值”、“2”、“第三”、“值”、“3”]

然后你可以使用一个非常简单的正则表达式。

/(\w+)/g

实现第一个效果的最简洁方法需要一些数组操作,因为正则表达式不能返回嵌套结构。

您可以使用上面的正则表达式 ( /(\w+)/g) 来获取一个matched数组,并通过以下方式运行它:

var finalArr= [];

for (var i= 1, j= 0; i < matched.length; i += 3) {
  finalArr[j] = match.slice(i, 3);
  j++;
}
于 2016-02-18T12:45:57.717 回答
3

我会使用split

var str = "first.value[1].second.value[2].third.value[3]";
var res = str.split(/\]\.?|\[|\./)
于 2016-02-18T12:47:25.180 回答
2

按照您的模式想法,您可以使用这样的正则表达式:

(.*?)\.(.*?)\[(\d+)\]\.?

工作演示

比赛信息

MATCH 1
1.  [0-5]   `first`
2.  [6-11]  `value`
3.  [12-13] `1`
MATCH 2
1.  [15-21] `second`
2.  [22-27] `value`
3.  [28-29] `2`
MATCH 3
1.  [31-36] `third`
2.  [37-42] `value`
3.  [43-44] `3`
于 2016-02-18T12:45:41.413 回答
1

string.match(/(\w+)/g)string 上的 match 方法可以生成您正在寻找的数组。只需提取单词\w

var regex = /(\w+)/g;
var str = "first.value[1].second.value[2].third.value[3]";

var arr = str.match(regex)


document.querySelector('pre').innerHTML = JSON.stringify(arr, 0, 4);
<pre></pre>

于 2016-02-18T12:45:50.927 回答
0

您可以分两步尝试,使用 分割].,然后使用 下一步分割.

var str = "first.value[1].second.value[2].third.value[3]";
var tempArr  = (str+'.').replace(/\[/g,'.').split('].');
var finalArr = tempArr.map(function(v){return v.split('.');});

//result: [["first", "value", "1"], ["second", "value", "2"], ["third", "value", "3"], [""]]
于 2016-02-18T12:51:47.587 回答