正则表达式

来源:互联网 发布:点对点聊天软件 编辑:程序博客网 时间:2024/06/07 22:03

注意:Regex并不是一个静态类。不过它有静态方法
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication8{    class Program    {        static void Main(string[] args)        {            string str = "123456";            Regex regex = new Regex(@"\d{5}");            //这里使用它的非静态方法IsMatch            bool b = regex.IsMatch(str);            Console.WriteLine(b);            //也可以直接调用它的静态方法IsMatch  (注意:这个IsMatch方法与上面的那个IsMatch方法不是同一个方法)            bool c = Regex.IsMatch(str, @"\d{5}");            Console.ReadKey();        }    }}


正则表达式元字符
.表示除\n之外的任意的单个字符
a.b 就表示a与b中间除\n外的任何单个字符都可以匹配。

[]是一个字符组,我们要的值仅仅是这个字符组中的某一个字符。(注意:是单个字符)
例如:a[abcd]b
它可以匹配:aab    abb    acb   adb    (即:我们可以在中括号里任意选择一个字符来匹配)

[0-9]就表示 匹配0到9之间的任何一个数字。
a[0-9]b 就可以匹配 a0b a1b a2b a3b a4b a5b a6b a7b a8b a9b

[a-z] 就表示:匹配a-z之间的任意一个字符。
a[a-z] b就可以匹配 aab abb acb adb aeb.....azb

[a-zA-Z] 表示配以匹配小写的a-z和大小的A-Z之间的任意一个字符(注意是一个字符)
a[a-zA-Z]b 表示可以匹配aab aAb abb aBb......

a[a-z][A-Z]b 这里使用了两个通配符,第一个通配符可以匹配小写的a-z之间的任意一个字符。第二个通配符可以通配A-Z之间的任意一个字符
所以a[a-z][A-Z]b 可以匹配 aaAb aaBb abCb .....等 (注意这是四个字符了)

[a-zA-Z0-9\-] 它可以匹配a-z或A-Z或0-9直接的任意一个字符。  \-表示也可以匹配一个-     -前面加一个\是转义的意思。因为-是一个连字符。所以这里需要将它转义一下


出现在中括号的.
a[axy.]b   .的本意是除\n之外的任意一个单个字符 可以当它出现在[]中括号中的时候,它就仅仅表示一个. 从而失去了匹配任意一个字符的作用。 如果我们实在要让它在[]中括号里也有“可以匹配任意一个字符的意思” 那么我们可以这样来写 a[axy\.]b  即:在.的前面加一个斜杠\ 转义一下。


() 他又两种含义:第一种:改变优先级,第二种:分组

| 表示“或”的意思


限定符
{n}表示前面的表达式必须出现n次
{n,}表示前面的表达式至少出现n次,最多不限
{n,m}表示前面的表达式至少出现n次,最多m次
例如ab{3,5} 表示 可以匹配abbb  abbbb  abbbbb  即:b最少要出现3次,最多出现5次(注意{}花括号前面的表达式是b 而不是ab)
(ab){3,5} 则表示可以匹配 ababab  abababab  ababababab   即:ab最少出现3次,最多出现5次(注意{}花括号前面的表达式是ab 而不是b)

ab[0-9]{3} 相当于 ab[0-9][0-9][0-9]    即:[]中括号这个表达式要出现3次

* 表示示前面的表达式出现0次或则多次。相当于{0,}
+ 表示示前面的表达式出现1次或者多次。相当于{1,}
表示示前面的表达式出现0次或1次。相当于{0,1}

例如:颜色的英文,英国的写法和美国的写法都不同 英国的是colour 美国的是color
那怎么用一个表达式都可以匹配呢? 就这样写: colou?r   (因为?前面的表达式是u 而?则表示前面的表达式可以出现0次或者1次,所以这个表达式就可以匹配 colour 又可以匹配color了)
或者这样写 colou{0,1}r

?还有另外一个意思。就是终止贪婪模式



==============^与$===========
^表示字符串的开始
^abc表示字符串以a开始后面必须紧跟着bc 。相当于^(abc)。 实际上就是表示字符串必须以abc开始。

^还有一个意思,就是“非”的意思
例如:[^0-5]表示匹配除0到5以外的所有任意一个字符

$表示字符串的结束(其实就是正则表达式的结束)

678$ 表示字符串必须以8结尾,8前面必须紧跟着一个67。相当于(678)$ 。实际上就是表示字符串必须以678结尾




================简写==============

简写
\d 表示 [0-9]  例如:a\db相当于 a[0-9]b   (特别注意一点\d 除了可以匹配[0-9]这些正常的数字以外,它还可以匹配0123456789这些全角的数组。所以我们如果仅仅需要半角的数字只能使用[0-9]这样的书写方法)
\D 表示[^0-9]  例如:a\Db相当于 a[^0-9]b

\s 表示所有空白符
\S 表示\s的反面。即所有\s不能匹配的\S都能匹配

\w 表示[a-zA-Z0-9_]
\W 表示\w的方面 。即[a-zA-Z0-9_]不能匹配的,它都能匹配

由于.net默认采用unicode方式来匹配,所以\w也可以匹配汉字


\b表示单词的边界
例如: hello, welcome to out country。
那么hello的边界就是那么逗号, welcome的边界则是它右边的空白 to的边界也是它自己右边的空白 country的边界则是她自己右边的句号。
总结一下,单词的边界就是指不是单词的哪些字符或者没有字符。它都认为是单词的边界

问:怎么匹配任意字符?
我们知道.是可以匹配除\n外的任意一个字符。 而[\s\S] 则可以匹配任意字符。

正则表达式的转义符
正则表达式同样支持\转义符
对于元字符,限定符等。如果要匹配字符本身都,则需要转移
例如 \d 相当于[0-9]  那么假如我们要匹配\d的本身呢? 那么只要在\d 的前面再加一个\就可以了 如:\\d

还有其他的如:\*   \+   \.  \-   \{2,3}   \\d 等等。

如果我要忽略所有的元字符。 例如 :我就想输出 * . - 这些字符串,而不是将他们作为有特殊意义的元字符怎么办呢?
其实这个问题相当于C#中的的 @符号。在所有的转义符前面加上一个@,那么转义符就失去意义了
那么在这里我们可以这么做 :string s=Regex.Escape(@"\d{1,3}");


一个正则表达式当出现双引号的时候我们怎么做书写

//href="http://www.baidu.com"MatchCollection mcc = Regex.Matches(html, @"href=""http://www.baidu.com"""); //如果前面加了@符号,则遇到双引号的时候用两个双引号表示一个双引号MatchCollection mccc = Regex.Matches(html, "href=\"http://www.baidu.com\"");//如果前面没有加@符号,则遇到双引号的时候,需要用\将双引号转义一下就可以了



单词的边界

注意:两个\b中间是一个单词 但是  \b###\b 这两个\b中就不是一个单词,因为它要求前面一个\b的右边必须是组成单词的字符。 而\b的右边是#,#不是组成单词的字符

而后面的那个\b要求它左边必须是组成单词的字符,而后面这个\b的左边也是# 它也不是组成单词的字符。所有 \b###\b 这两个\b中间的并不是一个单词。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication9{    class Program    {        static void Main(string[] args)        {            //单词的边界\b            //单词边界就是指一个单词的左边和右边都是一些非单词的组成字符,如果 空格 . , ? $^&* 等等                        //下面有一段字符串,我们要将 row这个单词替换成line 这个单词            string str = "The day after tomorrow is my wedding day.The row we are looking for is .row. number 10.";            //str = Regex.Replace(str, "row", "line");//这是错误的,如果这样写的话,也会将tomorrow这个单词的最后的row也替换掉。因为tomorrow这个单词后面的三个字符tow不是一个独立的单词,所以这不符合我们的需求。我们的需求是将独立的单词row替换成line            str = Regex.Replace(str, @"\brow\b","line");  //两个\b 的中间就是一个独立的单词            Console.WriteLine(str);            //提取有三个字母的单词            string msg = "Hi,how are you?Welcome to our country!";            MatchCollection mc= Regex.Matches(msg, @"\b[a-z]{3}\b", RegexOptions.IgnoreCase);            foreach (Match item in mc)            {                Console.WriteLine(item.Value); //输出:how are you our            }            Console.WriteLine("有三个字母的单词数量为{0}", mc.Count); //输出:有三个字母的单词数量为4            Console.ReadKey();        }    }}


当正则表达式中需要括号嵌套的时候 如: (()()) 最外层的是第一个分组,里面的第一个是第二个分组,里面的第二个是第三个分组

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication10{    class Program    {        static void Main(string[] args)        {            string str = "张三253519939@qq.com大家好才是真的好";            //当正则表达式出现小括号套小括号的的时候,最外面的小括号是就Groups[1]  反正就是从外面往里面数,最外层是Groups[1] 然后依次挽后推            //例如: (()())  :最外面的小括号是Groups[1] 然后他们里面有两个小括号,前面那个就是Groups[2],后面那个就是Groups[3]              MatchCollection mc = Regex.Matches(str, @"(([0-9]+)@[a-z]+.([a-z]+))");            foreach (Match item in mc)            {                Console.WriteLine(item.Groups[1].Value); //253519939@qq.com                Console.WriteLine(item.Groups[2].Value);//253519939                Console.WriteLine(item.Groups[3].Value);//com            }            Match mt = Regex.Match(str, @"(([0-9]+)@[a-z]+.([a-z]+))");            Console.WriteLine(mt.Groups[1].Value);//253519939@qq.com            Console.WriteLine(mt.Groups[2].Value);//253519939            Console.WriteLine(mt.Groups[3].Value);//com            Console.ReadKey();            Match mt1 = Regex.Match(str, "[0-9]+@[a-z]+.[a-z]+", RegexOptions.IgnoreCase);            Console.WriteLine(mt1.Groups[0].Value);        }    }}


基础:提取数据

using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            #region 案例1            while (true)            {                //要求用户输入一个整数,匹配是否为>=10 并且小于等于20的数                string s = Console.ReadLine();                bool b = Regex.IsMatch(s, "^(1[0-9]|20)$");                Console.WriteLine(b);            }            #endregion        }    }}

namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            while (true)            {                Console.WriteLine("请输入一个字符串");                string s = Console.ReadLine();                bool b = Regex.IsMatch(s, "^z|food|do$");  //表示匹配以z或者food或者do开头,或者以z 或food 或do结尾的字符串                Console.WriteLine(b);            }        }    }}
验证邮政编码 (邮政编码是6个纯数字)
namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            #region 验证邮政编码            while (true)            {                Console.WriteLine("请输入一个邮政编码");                string s2 = Console.ReadLine();                // bool b2= Regex.IsMatch(s2, "^[0-9]{6}$"); //或则采用下面的方式也可以                //由于.net默认采用unicode匹配方式,所以\d也匹配全角的数字。                //RegexOptions.ECMAScript 表示安装ASCII的方式来匹配,所以如果输入全角的数字就无法匹配成功了                bool b2 = Regex.IsMatch(s2, @"^\d{6}", RegexOptions.ECMAScript);                Console.WriteLine(b2);                //让我们来了解一下  "^[0-9]{6}$" 与 "[0-9]{6}"的区别                // "^[0-9]{6}$"只能匹配 0到9之间的任何6个数字。                 //而 "[0-9]{6}"  一个字符串中只要包含连续6个0到9之间的数字 就能成功匹配 比如abc123555dcd 都可以匹配            }            #endregion        }    }}

身份证验证
namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            #region 判断一个字符串是不是身份证号码            //1>长度为15位或者18为的字符串。首位不能是0            //2>如果是15位,则全部是数字            //3>如果是18位,则前17位都是数字,末尾可能是数字也可能是x或X            while (true)            {                Console.WriteLine("请输入身份证号");                string s = Console.ReadLine();                bool b = Regex.IsMatch(s, "^[1-9][0-9]{14} |[1-9][0-9]{16}[0-9xX]$");                //或者用下面这种方式也可以,而且更高效。(尽量少用| 因为或涉及到效率的问题)                bool Bb = Regex.IsMatch(s, "^[1-9][0-9]{14} ([0-9]{2}[0-9xX])?$");                Console.WriteLine(b);            }            #endregion        }    }}

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication3{    class Program    {        static void Main(string[] args)        {            #region 贪婪模式            //什么是贪婪模式:比如:a{1,5} 表示可以匹配的a 最少一个,最多5个。 而贪婪模式就是尽可能多的去匹配,即按照最多的去匹配,那就按最多5个a去匹配。            //再例如:在正则中+ 这个限定符,表示:前面的表达式出现1次或者多次,那么按照贪婪模式,就是尽可能的多的找到前面的表达式,而不是仅仅是1个(当然:如果前面的表达式仅仅只能找到1个,就另说了)。            string str0 = "1111 。111111 11。";            //.+默认会按照贪婪模式来匹配:.可以表示所有的单个字符, 而+ 表示这个单个字符可以最少出现1次,最多不限制,那么就将这个str字符串全部匹配了            Match m0 = Regex.Match(str0, ".+");            Console.WriteLine(m0.Value); //输出:1111 。111111 11。             //因为.可以匹配除\n外的任何当个字符串, 那么.+ 就表示这个“任何的单个字符”可以出现多次。于是.+就将str这个字符串全部匹配了。可以它发现后面还有个。号,如果.+将整个str字符串都匹配了,就没。号什么事了。加上这个。号就无法与str这个字符串匹配了。正则表达式就会尽量找到字符串与它来匹配,于是就会吐出一个字符,让.+只匹配1111 。111111 11 然后让正则的。号与str的。句号进行匹配。于是匹配成功了。            Match mm = Regex.Match(str0, ".+。");            Console.WriteLine(mm.Value); //所以这个正则匹配的字符串就是1111 。111111 11。            #endregion            #region 终止贪婪模式            //其实在限定符号前面加一个?号就是终止贪婪模式            string str = "1111 。111111 11。";            //.+默认是按贪婪模式来匹配,尽可能的多的去匹配。            //当在“限定符”后使用?号的时候,表示终止贪婪模式            //当终止贪婪模式以后,会尽可能少的去匹配            //现在在+后面加了一个?号。表示终止贪婪模式,+号表示前面的表达式出现1次或多次,既然现在是终止贪婪模式。于是会尽可能少的去匹配。于是就+?就表示前面的表达式出现1次。            //.号可以匹配所有单个字符。于是.匹配到了1  然后1出现1次 那么这里就提取到了一个1            Match m = Regex.Match(str, ".+?");            Console.WriteLine(m.Value);//输出1             //.可以匹配所有单个字符,*号表示前面的表达式出现0次或多次,既然现在是终止贪婪模式。于是会尽可能少的去匹配。所以就*?就会往0个去匹配。即:.表示的任何单个字符出现0次。所以就什么也不会输出了            Match a = Regex.Match(str, ".*?"); //这里什么也不会输出            Console.WriteLine(a.Value);//输出: 空                                   string msg = "abcccc";            //*表示前面的表达式出现0次或多次 *?表示终止贪婪模式。即b出现次。 所以这里提取到了一个a            Match m1 = Regex.Match(msg, "ab*?");            Console.WriteLine(m1.Value);//输出:a            //+表示前面的表达式出现1到多次 +?表示终止贪婪模式。那么前面的表达式就出现1次。 所以这里提取到abc            Match m2 = Regex.Match(msg, "abc+?");            Console.WriteLine(m2.Value);            // +表示前面的表达式最少出现1次或多次,+?表示终止贪婪模式,于是就会尽可能少的去匹配,.可以表示任何的单个字符。            //.+?。 如果1仅仅出现1次则不能匹配这个.+?。正则。只有1出现4次后面才开始出现一个。号 于是当1出现4次后,后面有一个句号于是与这个正则匹配成功。 所以这里提取到的是1111。            Match m3 = Regex.Match(str, ".+?。");            Console.WriteLine(m3.Value);//输出:1111。            #endregion            string str2 = "大家好,我是S.H.E。我是S。我是E。我是杨中科。我是苏坤。我是牛龙龙。我是N.L.L。ffff";            //Matches:在指定的输入字符串中搜索指定的正则表达式的所有匹配项。            //正则从“我是字符串开始,然后用小括号分组,小括号里面是一个.+ 表示可以匹配任何字符串,然后正则以。”            MatchCollection m4 = Regex.Matches(str2, "我是(.+?)。");            foreach (Match item in m4)            {                Console.WriteLine(item.Groups[1].Value);//打印出S.H.E S H E 杨中科 苏坤 牛龙龙 N.L.L            }            Console.ReadKey();        }    }}


提取网页中的邮箱

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication4{    class Program    {        static void Main(string[] args)        {            //下载字符串            WebClient client = new WebClient();            //提取http://bbs.rednet.cn/thread-44786545-1-1.html这个网页中的所有邮箱            string html = client.DownloadString("http://bbs.rednet.cn/thread-44786545-1-1.html");            MatchCollection mc = Regex.Matches(html, "mailto:(.+?)\">");            foreach (Match item in mc)            {                Console.WriteLine(item.Groups[1].Value);            }            Console.ReadKey();        }    }}

或者用这个正则也可以

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication4{    class Program    {        static void Main(string[] args)        {            //下载字符串            WebClient client = new WebClient();            //提取http://bbs.rednet.cn/thread-44786545-1-1.html这个网页中的所有邮箱            string html = client.DownloadString("http://bbs.rednet.cn/thread-44786545-1-1.html");            //MatchCollection mc = Regex.Matches(html, "mailto:(.+?)\">");            MatchCollection mc = Regex.Matches(html, @"[a-zA-Z0-9\-]+@[a-zA-Z0-9\-]+(\.[a-zA-Z0-9]+){1,2}");            foreach (Match item in mc)            {                Console.WriteLine(item.Value); //或者直接Console.WriteLine(item)也可以            }            Console.ReadKey();        }    }}

使用正则提取图片  |  使用WebClinet类来下载html 及下载图片

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication5{    class Program    {        static void Main(string[] args)        {            WebClient web = new WebClient();            //下载目标网页的html            string html = web.DownloadString("http://bbs.rednet.cn/thread-43877250-1-1.html");            //<img style="cursor:pointer" id="aimg_6469251" aid="6469251" src="static/image/common/none.gif" onclick="zoom(this, this.getAttribute('zoomfile'), 0, 0, '1')" zoomfile="http://f3.rednet.cn/data/attachment/forum/201501/25/184529kl05irtsiqz0kgiu.jpg" file="http://f3.rednet.cn/data/attachment/forum/201501/25/184529kl05irtsiqz0kgiu.jpg.thumb.jpg" inpost="1" alt="234035xab04x994ix4htlx.jpg" title="234035xab04x994ix4htlx.jpg" onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})" />            //提取图片地址            MatchCollection mc = Regex.Matches(html, @"<img\s+style="".+""\s+id="".+"".+file=""(.+?)""",RegexOptions.IgnoreCase);//RegexOptions.IgnoreCase表示忽略大小写            foreach (Match item in mc)            {                Console.WriteLine(item.Groups[1].Value);                //下载图片                web.DownloadFile(item.Groups[1].Value, @"d:\123\"+DateTime.Now.ToFileTime() + ".jpg");            }            Console.ReadKey();        }    }}

提取网页的内容的标题

using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication7{    class Program    {        static void Main(string[] args)        {            WebClient web = new WebClient();            string html = web.DownloadString("http://search.51job.com/list/%2B,%2B,%2B,%2B,%2B,%2B,asp.net,1,%2B.html?lang=c&stype=2");            //<font color="#fe0201">ASP.NET</font>高级程序员</a>            //<a title="ASP.NET工程师 (高薪诚聘)" target="_blank"            MatchCollection mc = Regex.Matches(html, @"<a\s*title=""(.+?)""|<font\s+color="".+?"">(.+?)</font>(.+?)</a>");            List<string> list = new List<string>();            foreach (Match item in mc)            {                //list.Add(item.Groups[1].Value + item.Groups[2].Value);                //Console.WriteLine(item.Groups[1].Value + item.Groups[2].Value);                if (item.Groups[1].Value!=null && item.Groups[1].Value!="")                {                    list.Add(item.Groups[1].Value);                }                else                {                    list.Add(item.Groups[2].Value + item.Groups[3].Value);                }            }            foreach (string item in list)            {                Console.WriteLine(item);            }            Console.ReadKey();        }    }}


替换

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication6{    class Program    {        static void Main(string[] args)        {            //字符串替换            string msg = "你aaa好aa哈哈a你";            msg = msg.Replace("a", "A");//将a替换成A            Console.WriteLine(msg); //输出:你AAA好AA哈哈A你            //使用正则来替换            string msg1 = "你aaa好aa哈哈a你";            msg1 = Regex.Replace(msg, "a", "A"); //将a替换成A            Console.WriteLine(msg1);//输出:你AAA好AA哈哈A你            string msg2 = "你aaa好aa哈哈a你";            msg2 = Regex.Replace(msg2, "a+", "A");             Console.WriteLine(msg2);//输出:你A好A哈哈A你            //将连续的_都替换成一个-            string msg3 = "234____234__34_____55";            msg3 = Regex.Replace(msg3, "_+", "-");            Console.WriteLine(msg3);            //将hello 'welcome' to 'china' 替换成 hello 【welcome】 to 【china】            string msg4 = "hello 'welcome' to 'china'";            msg4 = Regex.Replace(msg4, @"\s+'", "【");            msg4 = Regex.Replace(msg4, "'\\s*", "】");            Console.WriteLine(msg4);            //第二种方式            string msg5 = "hello 'welcome' to 'china'";            msg5 = Regex.Replace(msg5, "'(.+?)'", "【$1】");            Console.WriteLine(msg5);                        //将10/12/2015 这种日期转换成 2015-10-12 这种            string msg6 = "我的生日是10/12/2015椰";            msg6 = Regex.Replace(msg6, "([0-9]|1[0-2])/([0-9]|1[0-9]|2[0-9]|3[0-1])/([1-2][0-9]{3})", "我的生日是$3-$1-$2椰");            Console.WriteLine(msg6); //输出:我们的我的生日是2015-10-12椰            //隐藏手机号码中的一些数字            string msg7 = "张三18620557713李四13655447569";            msg7 = Regex.Replace(msg7, @"(1[0-9]{2})[0-9]{4}([0-9]{4})", "$1****$2");            Console.WriteLine(msg7);//输出:张三186****7713李四136****7569            Console.ReadKey();        }    }}


叠词的提取。与 正则表达式的分组引用问题 \1 与$1的区别

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication11{    class Program    {        static void Main(string[] args)        {            //叠词验证            string str = "简简单单清清白白千千万万曲曲弯弯";            //我们千万要注意:在正则表达式内部,必须使用\来引用组。 比如在正则表达式内部\1表示第一组 \2表示第二组  \3表示第三组            //在正则外部,比如使用替换的时候 是用$1来表示第一组 $2表示第二组,$3表示第三组            //看下面这个例子: @"(.)\1+" 这个是一个正则表达式,在这里正则表示式的内部是用 \1来引用了第一个分组, 而在这个正则的外部 我们用$1来表示一个分组的内容。 这都是正则表达式的规定            str = Regex.Replace(str, @"(.)\1+", "$1");  //这里@"(.)\1+"是什么意思? 首先.表示除\n外的任何单个字符,然后这个.用小括号括起来,就表示分组,而这个小括号后面跟的那个\1是什么意思呢?其实这个\1就表示这个分组本身的内容。 比如(.)表示字符"简"的时候 那么这个\1就表示"简" 。 因为这里只有一个小括号,表示这个正则表达式只分了一组。所以这里这可以有一个\1 如果分了2组,第二组就可以用\2来表示。            //例如:()()\1\2   此时这个\1就表示前面那个括号的内容,\2就表示后面那个括号的内容            //例如(()())\1\2\3  因为这里分了3个组,第一个组就是最外面那个括号,他的内容就是\1 最外面的那个括号里面有两个小括号,前面那个小\2 即第二组,后面那个是\3 即第三组            //例如: ((a)x(b))\1\2\3   首先(a)x(b)是最外面的那个括号的内容,它表示第一组 (a)表示第二组 (b)表示第三组            // 而((a)x(b))后面跟了一个\1 就表示这里出现一个第一组的内容 即axb后面又出现一个axb  即axbaxb  而\1后面又出现一个\2 而\2的就表示第二组的内容 ,第二组的内容是a 即axbaxb后面要跟一个a 然后就组成了 axbaxba 然后\2后面又跟了一个\3  而\3又表示第三组的内容,第三组的内容是b 所以axbaxba后面又出现一个b 然后就组成了 axbaxbab            //AABB 这样的叠词 可以用 @"(.)\1(.)\2" 这个正则来提取,但是这样不是很严谨。因为AAAA 也能与这个正则匹配成功。虽然不严谨,但是可以用这个正则来提取叠词。            Console.WriteLine(str);//输出:简单清白千万弯曲             Console.ReadKey();        }    }}

用正则将将一个邮箱的用户名的中间部分用*号替代

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;namespace ConsoleApplication12{    class Program    {        static void Main(string[] args)        {            string str = "你好,我的邮箱是:27006267@qq.com ";            Match email = Regex.Match(str, "[0-9a-z_]+@[a-z0-9]+(.[a-z0-9]+){1,2}");                       Program p=new Program();                  Regex e = new Regex(".+");            //第一个参数是一个通过正则提取到的字符串,第二个参数是一个委托            str = e.Replace(email.Value, new MatchEvaluator(p.MatchE));            Console.WriteLine(str);            Console.ReadKey();        }        //这个match其实就是一个那个通过正则提取到的字符串27006267@qq.com 然后我们在里对这个字符串进行处理        public string MatchE(Match match)        {            string[] str = match.Value.Split('@');            string userName =str[0].Substring(1,str[0].Length-2);            string newStr = null;            for (int i = 0; i < userName.Length; i++)            {                newStr += "*";              }            string firstStr = str[0].Substring(0, 1);            string lastStr = str[0].Substring(str[0].Length - 1, 1);            newStr = firstStr + newStr + lastStr + str[1];            return newStr;                ;        }    }}



0 0