【问题标题】:Nested capturing groups result嵌套捕获组结果
【发布时间】:2016-05-30 15:09:21
【问题描述】:

如何获得这样的数组

[
    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

【问题讨论】:

  • 使用循环并动态构建数组。类似while ((m=regex.exec(str)) !== null) { arr.push(m[1], m[2], m[3]); ....};this demo 产生["first", "value", "1", "second", "value", "2", "third", "value", "3"]
  • 我知道我可以手动完成。但我很好奇如何用一个正则表达式做同样的事情。
  • 您能用一个正则表达式阐明 部分吗?正则表达式无法创建、填充数组。有特定的语言手段。正则表达式只能匹配(或不匹配)某些文本。
  • 我不想使用额外的迭代结构,而只是依赖正则表达式的魔法!或者,至少,我想知道这是否可能。但是您和 Federico Piazza(在对他的回答的评论中)回答了我的疑问。正则表达式不是那么神奇
  • 这取决于语言。在 Python 中,re 和 regex 模块中有非常酷的方法。只是 JS 对正则表达式没有那么神奇,而且它的正则表达式方法相当具有误导性。

标签: javascript regex nested capturing-group


【解决方案1】:

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

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

【讨论】:

  • 我可以在 regex101.com 上实现相同的效果,但在 Javascript 上执行它(这是我需要它工作的地方),使用 RegExp.prototype.exec (),不返回那个多级数组。
  • @Kamafeather 我专注于您的声明or (even better)。您不能使用正则表达式生成多级数组。正则表达式只是一个模式匹配器,如果你需要逻辑,你必须在其中添加代码
【解决方案2】:

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>

【讨论】:

    【解决方案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++;
    }
    

    【讨论】:

    • 是否可以像第一个例子那样得到嵌套结构?
    • 不是真的,但是我已经编辑了我的答案以包含一个相当简单的解决方案,尽管它不仅仅是正则表达式,恐怕。
    【解决方案4】:

    我会使用split:

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

    【讨论】:

    • 是否有可能像第一个示例一样获得嵌套结构?
    • @Kamafeather:不幸的是,我认为这不可能
    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多