使用regexp解析嵌套的markdown列表

时间:2013-12-03 09:23:46

标签: javascript regex node.js markdown

我想解析一些嵌套的markdwon列表,如下所示:

* elem 1
* elem 2
  * child 1
  * child 2
    * child 1
* elem 3
  * child 1

列表嵌套是标签式的。因此每个级别都有 n 标签。 我正在寻找一个可以给我每个级别的正则表达式,例如级别3有\t\t,级别2只有\t,级别1没有标签,但都以*开头。

如何将这些要求与不同的正则表达式相匹配?

对1级元素的一次尝试是:

^(?=\*).*

但是这只选择了第1级的第一个元素(例如找不到elem 2和elem 3)。

BR,

mybecks

3 个答案:

答案 0 :(得分:1)

我相信你可以使用:

/^\s+\* (.+)$/gm

答案 1 :(得分:1)

这是一个返回regexp(基于你的)的函数,用于匹配特定级别的所有元素:

function getNestedRegexp(level) {
  return new RegExp('^(?=\\t{'+level+'}\\*).*','gm');
}

// Usage:
var elements = str.match(getNestedRegexp(1)); // all elements on level 1

DEMO:http://jsbin.com/EcAKIza/1/edit

正如其他人所说,regexp可能不是最好的解决方案,所以选择此选项时要小心。

编辑:我不确定你为什么在那里使用积极的前瞻。一个更好的正则表达式可能是:

/^\t{N}\*.*/gm

DEMO&说明:http://regex101.com/r/rZ7mD1

答案 2 :(得分:1)

如果我理解你的话你想要这个:

/^\*.*?(?=^\*|\Z)/sm

基本上它意味着从行首开始匹配,按字面意思匹配*然后非贪婪地匹配但不包括下一个^\*EOF

编辑:

这对你不起作用,因为javascript不支持\Z,oops启用了错误的正则表达式引擎风格,将很快更新:)

编辑2:

这应该适用于javascript:

^\*[^]+?(?=^\*)|^\*[^]+

必须对最后一个元素使用替换,即如果从正则表达式的末尾删除|^\*[^]+,它将不匹配最后一个元素:(。