V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AndyAO
V2EX  ›  程序员

挑战:用正则表达式将整个 MarkDown 文件按照标题#拆分成子字符串

  •  1
     
  •   AndyAO · 2021-07-19 19:38:25 +08:00 · 1001 次点击
    这是一个创建于 1073 天前的主题,其中的信息可能已经有所发展或是发生改变。

    也就是按照标题进行拆分,将每个标题 1,及其下辖内容,变成独立的字符串。

    由于是挑战的性质,所以要求只调用正则表达式引擎 1 次就完成任务。

    怎么才算赢呢?只要指出优越性就行,也许是性能,也许是可读性。

    如果你想挑战的话可以试试看。

    至于我的答案嘛,就放在最后了。

    结果

    如果放 Match 对象,那么又要重复原文内容,这里放个图吧。

    戳此查看

    原文

    # 0
    
    Content 0
    
    ## 0.0
    
    Content 0.0
    
    ### 0.0.0
    
    Content 0.0.0
    
    #### 0.0.0.0
    
    Content 0.0.0.0
    
    ### 0.0.1
    
    Content 0.0.1
    
    ### 0.0.2
    
    Content 0.0.2
    
    ## 0.1
    
    Content 0.1
    
    ## 0.2
    
    ### 0.2.0
    
    Content 0.2.0
    
    ### 0.2.1
    
    Content 0.2.1
    
    ## 0.3
    
    # 2
    
    Content 2
    
    # 3
    
    Content 3
    
    # 4
    
    Content 4
    

    参照

    我的答案是这样的,用捕获组是为了提取,也是为了加个分隔和注释,方便阅读。

    C#的正则引擎对各种高级特性支持都比较好,我平常又比较常用,所以用的是这个。

    断言在某些引擎上运行可能会失败,不要高估了正则表达式在不同引擎上的兼容性。

    ^(?<TitleSymbol>#)( )(?<Title>.+)(\n)(?<Content>[\s\S]+?)((?=(\n# ))|(?![\s\S]))

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3737 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:23 · PVG 13:23 · LAX 22:23 · JFK 01:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.