匹配换行符 - \ n或\ r \ n?

时间:2013-11-18 19:40:01

标签: regex language-agnostic line-breaks

在撰写this answer时,我必须完全匹配换行符,而不是使用s - 标记(dotall - 点匹配换行符)。

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

我注意到了

  • Regex101仅在\n上匹配换行符 (example - 删除\r并且匹配)

  • RegExr与\n上的<{1>} 以及\r\n上的 不匹配。 除了m - 标志和\s外,我找不到能使其与换行符匹配的内容 (example

  • Debuggex表现得更加不同:
    this example中,它仅在\r\n上匹配,而在 here它仅匹配\n,并指定相同的标志和引擎

我完全了解m - 标志(多行 - 使^与开头匹配,$与行尾相匹配),但有时这不是一个选项。与\s相同,因为它也匹配制表符和空格。

我想使用unicode换行符(\u0085)并不成功,所以:

  1. 是否有一种故障安全方式将匹配线路(最好不管使用的语言)整合到正则表达式中?
  2. 为什么上述网站的行为有所不同(尤其是Debuggex,仅在\n上匹配一次,在\r\n上只匹配一次)?

5 个答案:

答案 0 :(得分:147)

以相反的方向回答;)

2)关于\ r和\ n的完整解释我必须参考这个问题,这个问题比我在这里发布的要完整得多:Difference between \n and \r?

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

1)[\r\n]+正如Ilya建议的那样可行,但也会匹配多个连续的新行。 (\r\n|\r|\n)更正确。

答案 1 :(得分:7)

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

我使用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。

答案 2 :(得分:1)

这仅适用于问题1.

我有一个在Windows上运行并使用多行MFC编辑器框的应用程序 编辑器框期望CRLF换行符,但我需要解析输入的文本 有一些非常大/讨厌的正则表达式'。

我不想在写正则表达式时强调这一点,所以
我最终在解析器和编辑器之间来回规范化,以便 正则表达式只是使用\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" );
 }

答案 3 :(得分:0)

在Python中:

# as Peter van der Wal's answer
re.split(r'\r\n|\r|\n', text, flags=re.M) 

或更严格:

# https://docs.python.org/3/library/stdtypes.html#str.splitlines
str.splitlines()

答案 4 :(得分:-1)

在记事本中,++ \ R匹配\ n和\ r \ n。