在写这个答案时,我必须只匹配换行符,而不是使用s标志(dotall - dot匹配换行符)。
通常用于测试正则表达式的站点在尝试匹配\n或\r\n时表现不同。
我注意到
Regex101只匹配\n上的换行符
(示例-删除\r,它匹配)
RegExr既不在\n上也不在\r\n上匹配换行符
我找不到什么东西让它匹配换行符,除了m标志和\s
(例子)
Debuggex的行为更加不同:
在这个例子中,它只匹配\r\n,而
这里它只匹配\n,并指定了相同的标志和引擎
我完全了解m标志(multiline -使^匹配一行的开始和$结束),但有时这不是一个选项。\s也是一样,因为它也匹配制表符和空格。
我想使用unicode换行符(\u0085)是不成功的,所以:
是否有一种安全的方法将换行符上的匹配(最好与使用的语言无关)集成到正则表达式中?
为什么上面提到的站点行为不同(尤其是Debuggex,只在\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 '。
我不想在写正则表达式的时候强调这个,所以
我最终在解析器和编辑器之间进行了标准化,这样
正则表达式只使用\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" );
}