请教一个正则表达式:让任何两个段落之间都有两个换行符

2019-12-10 13:45:22 +08:00
 Newyorkcity

在 markdown 文档的整理的时候,如果只是一个段结束,换行,不空一行就新起一段,那么最终显示的时候就好像这两段之间没有空行一样。。。emmmm。。。这好像是句废话

简单来说就是我在用 vscode 的正则表达式查找替换功能,想把一个 markdown 中任何之间没有空行(即只有段结尾一个换行符,然后就立刻新起一段)的两段都改成中间有一个空行的。。不知道这个正则表达式该怎么写。。

另外因为 markdown 里有表格,所以要除外表格的分隔符|后只接一个换行符的情况。。。

谢谢!!

1463 次点击
所在节点    问与答
4 条回复
geelaw
2019-12-10 13:57:38 +08:00
首先你对 Markdown 的语法理解有误。Markdown 换段需要有一个空白行,所以换一行并没有换段。在经典 Markdown 中,段落内换一行等同于一个空格,因为默认的 p 的 white-space 是 normal。在非经典实现中可能会让段显示为 pre-line,或者插入 br。

最佳实践是两个块级元素之间都应该有一个空白行,因此在表格周围也应该有空白行。

使用正则表达式替换是非常困难的,因为 Markdown 的句法不是正则语言。例如,用一个很短的正则表达式无法区分换行是否处于一段 code block 内,进而无法发现这里是否应该增加一个空行。又例如它很难处理 block quote 里面需要增加带有 > > 的空白行的情况。

如果没有上述情况,只要替换(\S)\n(\S) 为 $1\n\n$2 即可。
sivacohan
2019-12-10 14:05:10 +08:00
查找: ^((?!#))(.+?)((?<!\|))$
替换: $1$2$3\n

用了三个组:
第一个排除了开头是#(标题)
第二个排除了本身就是空行的情况
第三个排除结尾是|(表格的情况)
MonoLogueChi
2019-12-10 14:50:12 +08:00
说句题外话标准 markdown 语法,换行好像是结尾空 2 格,gfm 标准好像是直接换行,具体怎么实现都是看渲染器的。
zappos
2019-12-10 20:05:34 +08:00
@geelaw 我的做法是先把 code block 替换为一个 token,然后执行其它操作,最后再替换回来

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/627598

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX