匹配换行符 – \ 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
)是不成功的,所以:
- 有没有一种安全的方式来将匹配整合到一个换行符中(最好不pipe使用的语言如何)为正则expression式?
- 为什么上面提到的网站行为不同(特别是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" ); }