正则表达式
来源:互联网 发布:点对点聊天软件 编辑:程序博客网 时间:2024/06/07 22:03
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; ; } }}
- 【正则表达式】正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- 正则表达式
- Github错误:fatal: Authentication failed for 'https://github.com/ ...
- 关系的约束条件
- UVA_10976: Fractions Again?!
- 深度学习(DL)与卷积神经网络(CNN)学习随笔-05-基于Python的LeNet之CNN
- 欢迎使用CSDN-markdown编辑器
- 正则表达式
- 【Dinic】bzoj1497 noi2006 最大获利
- LCD常用接口原理
- http://www.kongxx.info/blog/?p=59
- Second Highest Salary
- 接口Iterator
- Header详解
- 脱壳
- 第六周项目(3):括号的匹配