多行字符串中任意数量的捕获组

时间:2014-08-31 02:13:17

标签: javascript regex capture-group

我有一个很长的Markdown格式字符串,它由一个或多个标题的重复部分和多行描述组成,如下所示:

**[Title1](link1) brief description** flag1, flag2
commentary,
occasionally multi-line
---

**[Title2](link2) brief description** flag3, flag4
**[Title3](link3) brief description** flag5, flag6, flag7
commentary
---

...

这个订单偶尔会被其他文字打破,在---和下一个标题之间交织。

我希望用JS的正则表达式来处理它,以便在不同的捕获组中捕获标题,链接,描述和注释。理想情况下,从给出的例子我想得到类似的东西:

1st match:
    group 1: Title1
    group 2: link1
    group 3: brief description
    group 4: commentary,
             occasionally multi-line

2nd match:
    group 1: Title2
    group 2: link2
    group 3: brief description 2
    group 4: Title3
    group 5: link3
    group 6: brief description 3
    group 7: commentary

 ...

我不会撒谎 - 我的正则表达式技巧可以使用一些抛光,但我设法解决了这个问题,将其限制为单一标题(使用类似于/\*\*\[(.*)\]\((.*)\)\s+(.*)\*\*.*\s+((?:.*\s)*?)?---/g的正则表达式)。有一个未指定数量的它们,我不知道如何将单独的片段收集到简洁的组中,因为无论我尝试什么,我要么为属于一个项目的标题获得单独的匹配,要么第二个和后续标题被混合使用评论。

这只能用正则表达式吗?我希望避免按项目边界分割(在这种情况下为**[---)并将其从那里进一步切割,因为这似乎不如单个正则表达式匹配优雅。

2 个答案:

答案 0 :(得分:1)

您正在尝试重复捕获组,然后访问所有捕获。不幸的是,这在JavaScript正则表达式引擎中不起作用(对大多数其他引擎也是如此)。 .NET引擎确实支持它。

我知道你不想先拆分,但这可能是最好的选择。如果你能以某种方式使用JS的.NET正则表达式引擎或者将你的项目更改为使用.NET / Powershell,那么你可以在纯正则表达式中使用它。

参考

Repeating a Capturing Group vs. Capturing a Repeated Group

答案 1 :(得分:1)

我想我得到了一个正则表达式

var re = /(?:\*\*\[(.*)\]\((.+)\) (.+)\*\* .*\n)(?:([^\*(?:\-\-\)]+))?/g;

我不确定这是你要求的,但它与你的输入和输出相匹配。 你可以play with it here (Regex101 example)

在这里,您可以找到使用该正则表达式的JSFiddle并显示捕获的组。

当然它不是很严格,所以你必须根据自己的需要改变它。

我希望这就是你想要的。