正则基础之 神奇的转义(3)


string test = "one line. \n another line.";
List<Regex> list = new List<Regex>();
list.Add(new Regex("\n"));
list.Add(new Regex("\\n"));
list.Add(new Regex(@"\n"));
list.Add(new Regex(@"\\n"));
foreach (Regex reg in list)
{
    richTextBox2.Text += "正则表达式:" + reg.ToString();
    MatchCollection mc = reg.Matches(test);
    foreach (Match m in mc)
    {
        richTextBox2.Text += "   匹配内容:" + m.Value + "   匹配起始位置:" + m.Index + "   匹配长度:" + m.Length;
    }
    richTextBox2.Text += "   匹配总数:" + reg.Matches(test).Count + "\n----------------\n";
}
/*--------输出--------
正则表达式:
   匹配内容:
   匹配起始位置:10   匹配长度:1   匹配总数:1
----------------
正则表达式:\n   匹配内容:
   匹配起始位置:10   匹配长度:1   匹配总数:1
----------------
正则表达式:\n   匹配内容:
   匹配起始位置:10   匹配长度:1   匹配总数:1
----------------
正则表达式:\\n   匹配总数:0
----------------
*/


可以看到,前三种写法,输出的正则虽不同,但执行结果却是完全相同的,只有最后一种是没有匹配的。
正则表达式一Regex("\n"),其实就是以普通字符串形式来声明正则的,与用Regex("a")来匹配字符“a”是同样的道理,是不经过正则引擎转义的。
正则表达式二Regex("\\n"),是以正则表达式形式来声明正则的,正如正则中的“\\\\”就等同于字符串中的“\\”一样,正则中的“\\n”就等同于字符串中的“\n”,是经过正则引擎转义的。
正则表达式三Regex(@"\n"),与正则表达式二等价,是字符串前加“@”的写法。
正则表达式四Regex(@"\\n"),其实这个表示的是字符“\”后面跟一个字符“n”,是两个字符,这个在源字符串中自然是找不到匹配项的。
这里需要特别注意的还是“\b”,不同的声明方式,“\b”的意义是不同的。

复制代码 代码如下:


string test = "one line. \n another line.";
List<Regex> list = new List<Regex>();
list.Add(new Regex("line\b"));
list.Add(new Regex("line\\b"));
list.Add(new Regex(@"line\b"));
list.Add(new Regex(@"line\\b"));
foreach (Regex reg in list)
{
     richTextBox2.Text += "正则表达式:" + reg.ToString() + "\n";
     MatchCollection mc = reg.Matches(test);
     foreach (Match m in mc)
     {
          richTextBox2.Text += "匹配内容:" + m.Value + "   匹配起始位置:" + m.Index + "   匹配长度:" + m.Length + "\n";
     }
     richTextBox2.Text += "匹配总数:" + reg.Matches(test).Count + "\n----------------\n";
}
/*--------输出--------
正则表达式:line_
匹配总数:0
----------------
正则表达式:line\b
匹配内容:line   匹配起始位置:4   匹配长度:4
匹配内容:line   匹配起始位置:20   匹配长度:4
匹配总数:2
----------------
正则表达式:line\b
匹配内容:line   匹配起始位置:4   匹配长度:4
匹配内容:line   匹配起始位置:20   匹配长度:4
匹配总数:2
----------------
正则表达式:line\\b
匹配总数:0
----------------
*/


正则表达式一Regex("line\b"),这里的“\b”是退格符,是不经过正则引擎转义的。源字符串中是没有的,所以匹配结果为0。
正则表达式二Regex("line\\b"),是以正则表达式形式来声明正则的,这里的“\\b”是单词边界,是经过正则引擎转义的。
正则表达式三Regex(@"line\b"),与正则表达式二等价,指单词边界。
正则表达式四Regex(@"line\\b"),其实这个表示的是字符“\”后面跟一个字符“b”,是两个字符,这个在源字符串中自然是找不到匹配项的。
2.5     .NET正则应用中其它转义处理
.NET正则应用中还有一些其它转义方式,虽然用得不多,但也顺便提一下吧。
需求:把字符串中“<”和“>”之间的数字前加上“$”

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wfyzjd.html