在撰写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
)并不成功,所以:
\n
上匹配一次,在\r\n
上只匹配一次)?答案 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。