嵌套捕获组结果

时间:2016-02-18 12:36:19

标签: javascript regex nested capturing-group

如何获得这样的数组

[
    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 - 我想为两种类型的结果(平面数组嵌套数组)获得正则表达式 s

5 个答案:

答案 0 :(得分:3)

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

  

[“first”,“value”,“1”,“second”,“value”,“2”,“third”,“value”,“3”]

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

/(\w+)/g

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

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

var finalArr= [];

for (var i= 1, j= 0; i < matched.length; i += 3) {
  finalArr[j] = match.slice(i, 3);
  j++;
}

答案 1 :(得分:3)

我使用split

var str = "first.value[1].second.value[2].third.value[3]";
var res = str.split(/\]\.?|\[|\./)

答案 2 :(得分:2)

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

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

<强> Working demo

匹配信息

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`

答案 3 :(得分: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>

答案 4 :(得分: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"], [""]]