嵌套捕获组结果

Nested capturing groups result

本文关键字:结果 嵌套      更新时间:2023-09-26

如何获得这样的数组

[
    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

我会使用split

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

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

[ "第一"、"值"、"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++;
}

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

(.*?)'.(.*?)'[('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`

string.match(/('w+)/g) 字符串上的 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>

您可以

分两步尝试,使用].拆分,然后下一步使用.

拆分
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"], [""]]