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

在编写这个答案时,我必须专门匹配换行符,而不是使用__abc0 -标志(dotall - dot匹配换行符)。

通常用于测试正则表达式的站点在尝试匹配\n\r\n时表现不同。

我注意到

  • Regex101只匹配\n
    上的换行符 (例子 - delete \r and它匹配)

  • RegExr匹配换行符既不\n也不\r\n
    上 我找不到什么东西使它匹配换行符,除了__abc0 -标志和\s
    李(例子) < / p > < / >

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

我完全了解__abc0 -标志(multiline -使^匹配一行的开始,而$匹配一行的结束),但有时这不是一个选项。\s也是一样,因为它也匹配制表符和空格。

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

  1. 是否有一种安全的方法将换行符上的匹配(最好与使用的语言无关)集成到正则表达式中?
  2. 为什么上面提到的站点行为不同(特别是Debuggex,只在\n上匹配一次,在\r\n上只匹配一次)?
572417 次浏览

我会反其道而行之。

  1. 关于\r\n的完整解释,我必须参考这个问题,这个问题比我在这里发布的要完整得多:\n和\r的区别?

长话短说,Linux使用\n作为新行,Windows使用\r\n,旧mac使用\r。有很多种方法来写换行符。第二个工具(RegExr)对单个\r进行匹配。

  1. Ilya建议的[\r\n]+将工作,但也将匹配多个连续的新行。(\r\n|\r|\n)更正确。

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

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

因此,在将文本粘贴到Debuggex之前,您应该通过文本编辑器清洗文本。确保粘贴的是你想要的样式。Debuggex默认为Unix样式(\n)。

此外,NEL (\u0085)是完全不同的东西:https://en.wikipedia.org/wiki/Newline#Unicode

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

这只适用于问题1。

我有一个运行在Windows上的应用程序,使用多行MFC编辑器框 编辑框期望CRLF换行,但我需要解析输入
的文本 用一些非常大/讨厌的regex '。< / p > 我不想在写正则表达式时强调这一点,所以是
我最终在解析器和编辑器之间进行了归一化,以便
正则表达式只使用\n。我还捕获粘贴操作,并将它们转换为方框。< / p >

这不会花太多时间 这就是我使用的。

 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" );
}

在PCRE中,\R匹配\n\r\r\n

在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()

有点晚了,但对于其他人来说可能是有用的。在javascript中,你可以简单地编写pipe (|)来匹配换行符/换行符。在我的情况下,我需要摆脱所有的逗号,分号和空格字符(包括换行符),所以我最终使用这个:

.split(/[\s,;|]+/)

不确定这是否是要求的:

(somethingToStaMatch)(.|\n)*?(somethingToEndMatch)

这将有3组匹配。还有中间的ALLWITHLINEBREAKS。可能会帮助那些用dotnet测试过的人。

string pattern = @"(somethingToStartMatch)(.|\n)*?(somethingToEndMatch)"

注意,即使你的文本有多个关键字对,*?也允许匹配!