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].+)
这正确地抓取了所有需要的文本,但形成了四个匹配而不是所需的两个。
感谢您的宝贵时间。
你可以使用
/^[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。例如,
-
https://github.com/markdown-it/markdown-it (arguably faster — and extensible — but you'll need extra tooling to convert the token stream into an AST: https://www.npmjs.com/package/@gerhobbelt/markdown-it-ast)
我正在寻找可以支持以下测试用例的正则表达式:
This should
all be
one match
#this should not match
1. nor this
> nor this
this should be a second match
所以我可以将这两个匹配项包装在
标记中。但是,我被困在换行符上:两个应该打破比赛,但一个换行符不能。这是我最接近的:
(^[A-z].+)
这正确地抓取了所有需要的文本,但形成了四个匹配而不是所需的两个。
感谢您的宝贵时间。
你可以使用
/^[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。例如,
https://github.com/markdown-it/markdown-it (arguably faster — and extensible — but you'll need extra tooling to convert the token stream into an AST: https://www.npmjs.com/package/@gerhobbelt/markdown-it-ast)