日期:2014-05-17  浏览次数:20861 次

请教下关于正则表达式\n和\r的区别
刚上班时无聊玩了玩正则..发现一个\n和\r的问题

请看以下这2张图





这个文本一共有5处换行(现在都不知道喊换行还是回车)..

出来的结果太古怪了..到底啥是\n(换行是匹配什么)..\r(回车匹配的又是什么)

诚心求解!
------最佳解决方案--------------------
先看代码再解释
string test = @"

1f2dsa1f3dsa

456

fdsaf1ds2af1dsa1fds2a3f123sda1fdsa
";
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-
*/

------其他解决方案--------------------
字符串中\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的匹配会有所差异
------其他解决方案--------------------
\n 新行  \r 行首
------其他解决方案--------------------
引用:
\n 新行  \r 行首


能稍微讲解下吗?我比较笨 - -0

哪些算是新行..哪些算是行首..
------其他解决方案--------------------
引用:
字符串中\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外的任意字符

我们在Ri……


终于明白了,十分感谢!!!!

我之前是想把一篇篇文章分成一行行..又不想用stream.readline..想用正则玩下

用[^\n]或[^\r]都不行..老是匹配到空的东西..原来是这么一回事..用[^\n\r]+就行了..

原来就是这么回事