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

Regex 匹配换行符-\n还是\r\n?,regex,language-agnostic,line-breaks,Regex,Language Agnostic,Line Breaks,在写作时,我必须只在换行符上进行匹配,而不是使用s-标志(dotall-点匹配换行符) 通常用于测试正则表达式的站点在尝试匹配\n或\r\n时表现不同 我注意到 Regex101仅在\n (-delete\r并匹配) RegExr既不匹配\n上的换行符,也不匹配\r\n 除了m-标志和\s () Debuggex的行为甚至更为不同: 在中,仅在\r\n上匹配,而 它仅在\n上匹配,并指定相同的标志和引擎 我完全了解m-标志(多行-使^匹配行的开始和$匹配行的结束),但有时这不是一个选项。与\

在写作时,我必须只在换行符上进行匹配,而不是使用
s
-标志(
dotall
-点匹配换行符)

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

我注意到

  • Regex101仅在
    \n

    (-delete
    \r
    并匹配)

  • RegExr既不匹配
    \n
    上的换行符,也不匹配
    \r\n

    除了
    m
    -标志和
    \s

    ()

  • Debuggex的行为甚至更为不同:
    在中,仅在
    \r\n
    上匹配,而
    它仅在
    \n
    上匹配,并指定相同的标志和引擎

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

我使用unicode换行符()的想法没有成功,因此:

  • 是否有一种故障保护方法将换行符上的匹配(最好不考虑所使用的语言)集成到正则表达式中
  • 为什么上述站点的行为不同(特别是Debuggex,只在
    \n
    上匹配一次,在
    \r\n
    上匹配一次)

  • 我会朝相反的方向回答

    2) 有关
    \r
    \n
    的完整解释,我必须参考这个问题,这个问题比我在这里发布的内容要完整得多:

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


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

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

    我使用Notepad++将Unix和Windows格式的示例文本粘贴到Debuggex中,无论我先粘贴哪个,都是Debuggex会话所坚持的

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

    此外,NEL(\u0085)是完全不同的:


    (\r?\n)
    将涵盖Unix和Windows。如果您还想匹配旧Mac,则需要更复杂的内容,如
    (\r\n |\r |\n)

    这只适用于问题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" );
     }
    

    在PCRE
    \R
    中,匹配Python中的
    \n
    \R
    \R\n

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

    您可以尝试
    [\r\n]+
    -或类似的方法,我使用:
    \r?\n
    来匹配
    \r\n
    \n
    行终止序列。它对旧的
    \r
    Mac语法不起作用,但这种语法现在非常少见。嘿,我是debuggex的创始人。这看起来像一个bug(对于debuggex,我不能代表其他人说话)。我添加了一个涉及此问题的高优先级问题。我们会尽快着手的-我们目前正将所有(非常有限的)资源集中在发布另一个产品上。@ridgerunner要添加Mac的语法,您可以做(\r?\n | \r),这与下面Peter van der Wal的答案类似,但更紧凑(10个字符对12个字符)。因此,
    \r
    /
    \n
    取决于操作系统-这是大家可能知道的(;)-但是为什么两个debuggex示例一次匹配一次\r\n,一次匹配一次\n?至少(在示例中)我看不到任何差异。很可能是因为您从windows文本编辑器复制了一个,而另一个是直接写入debuggex文本区域的。每个都使用了不同的换行符。事实上,因为在您的第三个示例(高级男子…)中,文本中有一个
    \r\n
    (如果右键单击并显示源代码,您将在某处找到
    {Infobox XC champions\r\n | Name=
    )。第二个工具是用Flash编写的,当您阅读“关于”页面时,会出现换行符错误。
    (\r\n | \r | \n)
    可以写得更简单,因为
    \r\n?
    @AsadSaeeduddin不,它不能。它不会匹配Unix行结尾
    \n
    关于debuggex的非常有趣的一点!另外,感谢你指出\u0085,这里有误导!@Sandwell:对不起,我不明白,这不是一个问题,这是一个答案,比
    更简单(\r\n\r\124;\ r\124n)