我想解析一些嵌套的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
答案 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:
^\*[^]+?(?=^\*)|^\*[^]+
必须对最后一个元素使用替换,即如果从正则表达式的末尾删除|^\*[^]+
,它将不匹配最后一个元素:(。