V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Newyorkcity
V2EX  ›  问与答

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

  •  
  •   Newyorkcity · 2019-12-10 13:45:22 +08:00 · 1543 次点击
    这是一个创建于 1844 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    谢谢!!

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

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

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

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

    用了三个组:
    第一个排除了开头是#(标题)
    第二个排除了本身就是空行的情况
    第三个排除结尾是|(表格的情况)
    MonoLogueChi
        3
    MonoLogueChi  
       2019-12-10 14:50:12 +08:00 via Android
    说句题外话标准 markdown 语法,换行好像是结尾空 2 格,gfm 标准好像是直接换行,具体怎么实现都是看渲染器的。
    zappos
        4
    zappos  
       2019-12-10 20:05:34 +08:00 via Android
    @geelaw 我的做法是先把 code block 替换为一个 token,然后执行其它操作,最后再替换回来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1261 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:53 · PVG 01:53 · LAX 09:53 · JFK 12:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.