刚上班时无聊玩了玩正则..发现一个\n和\r的问题请看以下这2张图这个文本一共有5处换行(现在都不知道喊换行还是回车)..出来的结果太古怪了..到底啥是\n(换行是匹配什么)..\r(回车匹配的又是什么)诚心求解!

解决方案 »

  1.   

    先看代码再解释
    string test = @"1f2dsa1f3dsa456fdsaf1ds2af1dsa1fds2a3f123sda1fdsa
    ";
    Regex regN = new Regex(@"[^\n]+");
    Regex regR = new Regex(@"[^\r]+");
    MatchCollection mc = regN.Matches(test);
    richTextBox2.Text += "[^\\n]+匹配结果:\n";
    foreach (Match m in mc)
    {
        richTextBox2.Text += "-Start-" + m.Value + "-End-\n";
    }
    richTextBox2.Text += "==========华丽的分割线==========\n";
    richTextBox2.Text += "[^\\r]+匹配结果:\n";
    mc = regR.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += "-Start-" + m.Value + "-End-\n";
    }
    /*-----输出-----
    [^\n]+匹配结果:
    -Start-
    -End-
    -Start-
    -End-
    -Start-1f2dsa1f3dsa
    -End-
    -Start-
    -End-
    -Start-456
    -End-
    -Start-
    -End-
    -Start-fdsaf1ds2af1dsa1fds2a3f123sda1fdsa
    -End-
    ==========华丽的分割线==========
    [^\r]+匹配结果:
    -Start-
    -End-
    -Start-
    1f2dsa1f3dsa-End-
    -Start-
    -End-
    -Start-
    456-End-
    -Start-
    -End-
    -Start-
    fdsaf1ds2af1dsa1fds2a3f123sda1fdsa-End-
    -Start-
    -End-
    */
      

  2.   

    字符串中\r\n是不可见字符,如果让它可见,应该是这样的
    \r\n
    \r\n
    1f2dsa1f3dsa\r\n
    \r\n
    456\r\n
    \r\n
    fdsaf1ds2af1dsa1fds2a3f123sda1fdsa\r\n
    \r\n
    这样应该就清楚了吧[^\n]+ 是排除\n外的任意字符
    [^\r]+ 是排除\r外的任意字符我们在RichTextBox等控件中敲一次Enter键,还原到字符串中,就是\r\n两个不可见字符的组合,注意下先后顺序就可以了
    在不同的语言中使用正则,小数点.对\r和\n的匹配会有所差异
      

  3.   


    终于明白了,十分感谢!!!!我之前是想把一篇篇文章分成一行行..又不想用stream.readline..想用正则玩下用[^\n]或[^\r]都不行..老是匹配到空的东西..原来是这么一回事..用[^\n\r]+就行了..原来就是这么回事