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

C# 中解决 「Regex 中的点号会匹配 CR」这个问题的最佳实践是什么?

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

    .默认不匹配 LF,在类 Unix 上就意味着不匹配 NewLine,这个机制是很好用的,但 Windows 上 NewLine 是 CRLF,那么这个机制用起来就不怎么方便了。

    例如,从字符串中提取 MarkDown 标题行做文件名,那么使用^# (.+)提取的内容后面就跟上了额外的 CR,还要通过 trim 来去除。

    在 Python 3 上这个问题是不存在的,因为字符串默认的换行是 LF,从文件中读取字符串时会自动转换将 NewLine 转换为 CRLF,而写入时又会改回去,从而在绝大多数场景下解决了这个问题。

    C# 好像没有这个机制,那么解决这种问题的最佳实践是什么呢?

    第 1 条附言  ·  2021-07-22 06:51:14 +08:00

    现在看来这应该是个设计上的败笔,为了兼容 Perl 5,.NET 既然对自己平台的 NewLine 都不能很好的支持。

    Python 和 Java,甚至 Perl 6 都是支持的。

    刚刚才在 StackOverFlow 发现了类似的问题。

    2 条回复    2021-07-21 15:47:28 +08:00
    ho121
        1
    ho121  
       2021-07-21 12:31:00 +08:00
    ^# ([^\r]+)

    这样?
    AndyAO
        2
    AndyAO  
    OP
       2021-07-21 15:47:28 +08:00
    @ho121 这种方式也许可以吧,还没有测试,但是兼容性估计会很差,因为 Windows 平台上也不是所有的文件都是 CRLF 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2863 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:43 · PVG 22:43 · LAX 06:43 · JFK 09:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.