Markdown 段落标记正则表达式

Markdown paragraph tag regex

我正在寻找可以支持以下测试用例的正则表达式:

This should
all be
one match

#this should not match
1. nor this
> nor this
this should be a second match

所以我可以将这两个匹配项包装在

标记中。但是,我被困在换行符上:两个应该打破比赛,但一个换行符不能。这是我最接近的:

(^[A-z].+)

这正确地抓取了所有需要的文本,但形成了四个匹配而不是所需的两个。

On Regexr

感谢您的宝贵时间。

你可以使用

/^[A-Za-z].*(?:\n[A-Za-z].*)*/gm

参见regex demo

详情

  • ^ - 行首(由于 m 修饰符)
  • [A-Za-z] - ASCII 字母
  • .* - 该行的其余部分
  • (?:\n[A-Za-z].*)* - 零个或多个以 ASCII 字母开头的行。

这不是您可以使用单个正则表达式完成的事情。虽然某些 Markdown 实现确实使用正则表达式作为解析 Markdown 的主要工具,但它们使用一系列表达式来这样做(参见原始实现,例如 markdown.pl)。

例如,您可能有一个匹配 header 的表达式、一个匹配列表项的表达式、一个匹配块引号的表达式和一个匹配任何文本块的表达式。这些表达式中的每一个都将依次 运行 针对输入。然而,当最后一个表达式为 运行 时,系列中的先前表达式已经消耗了各种其他元素。因此,匹配段落的最终表达式不需要考虑 headers、列表或块引用的匹配。

事实上,如果您要从 markdown.pl 中删除 header 表达式,那么所有 header 将简单地包含在 <p> 标签中,并带有散列 ( #) 仍包含在正文中。

我的意思是你需要实现一个完整的 Markdown 解析器。但是,已经存在许多实现。您可能最好使用一个已经存在的。事实上,大多数现代实现生成抽象语法树 (AST) 而不是进行正则表达式替换(正如另一个答案中指出的那样)。

像 Markdown/Commonmark 这样的语法不能[容易地,如果有的话] 用正则表达式解析。

使用合适的解析器来生成您可以操作的 AST。例如,