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正则应用中还有一些其它转义方式,虽然用得不多,但也顺便提一下吧。
需求:把字符串中“<”和“>”之间的数字前加上“$”
复制代码 代码如下: