JavaScript正则表达式仅捕获最后一组事件

时间:2014-12-08 11:34:51

标签: javascript regex

我正在尝试解析文档文本,其格式如下:

className : String
A text
colHeaders : Boolean (default false) 
colHeaders : Array [A, B, C, ...] 
colHeaders : Function function(index) { return ... }
Another text

Full documentation here

因此,文档中的每个选项都可以是多种类型,我想以编程方式恢复它们。我创建了一个JavaScript正则表达式:

^(\w+) : (\w+)[^\n]*(?:\n\1 : (\w+)[^\n]*)*

Regex101 demo page here

我成功检索了第一个选项类型(上例中的'String'和'Boolean'),但就正则表达式的第二部分而言,我只能检索最后一个组('Function',我在哪里想要'阵列'和'功能')。

如果我在正则表达式的末尾删除'*'量词,我只检索'数组'(如果我在其后添加非贪婪的符号'?',同样的事情),但我又想要两者。有没有办法在JS正则表达式中做到这一点?

1 个答案:

答案 0 :(得分:1)

"有没有办法在JS正则表达式中执行[访问某个组的先前捕获]?" - 否。

然而,您可以使用两个正则表达式 - 一个捕获块:

/^(\w+) : .*(?:\n^\1.*)*/gm

和一个将块解析为行的那个:

/^\w+ : (\w+)\s*(.*)/gm

,如

var str = [
        'className : String',
        'A text',
        'colHeaders : Boolean (default false)',
        'colHeaders : Array [A, B, C, ...]',
        'colHeaders : Function function(index) { return ... }',
        'Another text'
    ].join("\n"),
    reBlock = /^(\w+) : .*(?:\n^\1.*)*/gm,
    reLine = /^\w+ : (\w+)\s*(.*)/gm,
    block, line;

while (block = reBlock.exec(str)) {
    console.log(block[1]);
    while (line = reLine.exec(block[0])) {
        console.log(" - ", line[1], line[2]);
    }
}

打印

 className
  -  String 
 colHeaders
  -  Boolean (default false)
  -  Array [A, B, C, ...]
  -  Function function(index) { return ... }