匹配换行符 – \ n还是\ r \ n?

在写这个答案时 ,我不得不完全匹配换行符,而不是使用s flag( dotall -dot matches linebreaks)。

尝试匹配\n\r\n时,通常用于testing正则expression式的网站的行为会有所不同。

我注意到

  • Regex101仅在\n上匹配换行符
    ( 例如 – 删除\r和它匹配)

  • RegExr在\n \r\n都不符合换行符
    除了m flag和\s之外,我找不到一个能够匹配换行符的东西
    ( 例子 )

  • Debuggex的行为更加不同:
    在这个例子中它只匹配\r\n ,而
    这里只匹配\n ,指定相同的标志和引擎

我完全知道m -flag(多行 – 使匹配开始和$结束一行),但有时这不是一个选项。 与\s相同,因为它与选项卡和空格相匹配。

我以为使用unicode换行符( \u0085 )是不成功的,所以:

  1. 有没有一种安全的方式来将匹配整合到一个换行符中(最好不pipe使用的语言如何)为正则expression式?
  2. 为什么上面提到的网站行为不同(特别是Debuggex,一次只匹配\n ,一次只匹配\r\n )?

要朝相反的方向回答;)

2)关于\ r和\ n的完整解释我必须参考这个问题,这个问题比我在这里发表的要完整的多: \ n和\ r之间的区别?

长话短说,Linux使用\ n换行,Windows \ r \ n和旧的Mac \ r。 所以有多种方法来编写一个换行符。 您的第二个工具(RegExr)例如匹配单个\ r。

1)Ilyabuild议的[\r\n]+会起作用,但也会匹配多个连续的新行。 (\r\n|\r|\n)更正确。

Debuggex中的示例文本中有不同的行尾。 特别有趣的是,Debuggex似乎已经确定了您首先使用的是哪一行结束样式,并将所有input的其他行结束符转换为该样式。

我使用Notepad ++将Unix和Windows格式的示例文本粘贴到Debuggex中,而我先粘贴的是Debuggex会话的内容。

所以,在粘贴到Debuggex之前,您应该通过文本编辑器清理文本。 确保你粘贴你想要的风格。 Debuggex默认为Unix风格(\ n)。

另外,NEL(\ u0085)完全不同: https ://en.wikipedia.org/wiki/Newline#Unicode

(\r?\n)将涵盖Unix和Windows。 你需要更复杂的东西,比如(\r\n|\r|\n) ,如果你想和旧的Mac相匹配的话。

这只适用于问题1。

我有一个在Windows上运行的应用程序,并使用多行MFC编辑器框。
编辑框预计CRLF linebreaks,但我需要parsing文字enterred
与一些真正的大/讨厌的正则expression式“。

所以在编写正则expression式时,我不想强​​调这一点
我最终在parsing器和编辑器之间来回正常化
正则expression式只是使用\n 。 我也陷阱粘贴操作,并将其转换为框。

这并不需要太多时间。
这是我用的。

  boost::regex CRLFCRtoLF ( " \\r\\n | \\r(?!\\n) " , MODx); boost::regex CRLFCRtoCRLF ( " \\r\\n?+ | \\n " , MODx); // Convert (All style) linebreaks to linefeeds // --------------------------------------- void ReplaceCRLFCRtoLF( string& strSrc, string& strDest ) { strDest = boost::regex_replace ( strSrc, CRLFCRtoLF, "\\n" ); } // Convert linefeeds to linebreaks (Windows) // --------------------------------------- void ReplaceCRLFCRtoCRLF( string& strSrc, string& strDest ) { strDest = boost::regex_replace ( strSrc, CRLFCRtoCRLF, "\\r\\n" ); }