一、正则表达式中的元字符
1. ".": 意思:除了\n以外的任意字符
2. "[]": 意思:字符组,任意单个字符,在中括号中任意一个字符
3. "|": 意思:表示或的意思,“或”的优先级非常低,最后才计算
4. "()": 意思:1.改变优先级;2.提取组(分组)
5. "{n}": 意思:前面的表达式必须出现n次
6. "{n,}":意思:面的表达式最少出现n次,最多不限
7. "{n,m}":意思:前面的表达式最少出现n次,最多出现m次
8. "*": 意思:出现0次或多次{0,}
9. "+": 意思:出现1次或多次{1,}
10. "?": 意思:出现0次或1次{0,1} ?的另外一个意思是:终止贪婪模式
11. "^": 意思:表达式的开始 例如:^hello意思:表示hello开始
意思:非 例如: a[^0-9]b 意思:a和b中间的这个值除了0-9以外的任何字符
12. "$": 意思:表达式的结束 例如:888$意思:表示已888结束
13.简写表达式:
\d等于[0-9] 意思:也会匹配全角1234567890
\D等于[^0-9] 意思:表示0-9以外的所有字符
\s 意思:表示所有空白符
\S 意思:表示\s的反面
\w 意思:意思:[a-zA-Z0-9_]
\W 意思:意思:[^a-zA-Z0-9_] \w的反面
\b 意思:单词的边界 例如:hello,welcome to country. ,k空格.都是单词边界(单词两边不匹配单词)
14.表达式的转义:
\*、\+、\[、\-、\{2,3}、\\d、$$1....
二、深入了解正则表达式
组(使用"()"来提取组)
验证日期格式 28/05/1989的正则:@"(\d{2})/(\d{2})/(\d{4})";其中第一个(\d{2})表示提取第一组;第二个(\d{2})表示提取第二组;第三个(\d{4})表示提取第三组
引用组(使用"$组号"来引用组)
我有一个日期格式为:28/05/1989,我想将其转换成1989-05-28格式;
Regex.Replace(msg,@"(\d{2})/(\d{2})/(\d{4})", "$3-$2-$1",RegexOptions.ECMAScript);
得到的结果就是1989-05-28
反向引用(使用"\组号"来引用组)
“反向引用”引用的也是正则表达式中的分组信息(提取组),“反向引用”时引用分组信息是在正则表达式内部进行“引用组”
Regex.Replace(str, @"(.)\1+","$1"); //表达式中\1表示反向引用第一组(.)的值;$1引用第一组的值
环视
环视有四种:
(?=) 肯定正向环视
(?!) 否定正向环视
(?<=)肯定逆向环视
(?否定逆向环视
Regex.Matches(str,@"(? //(?:在\d{5}值像左看不是数字;(?!\d):在\d{5}值像右看不是数字
贪婪模式
默认是贪婪模式;在量词后面直接加上一个问号?就是非贪婪模式。
示例:
三、C#中使用正则
匹配
bool b = Regex.IsMatch(string input,string pattern);
提取
Match match = Regex.Match(string input,string pattern);
提取组(分组:"()";1.改变优先级,2.提取组)
MatchCollection matches = Regex.Matches(string input,stringpattern);
替换
string msg = Regex.Replace(string input,string pattern,stringreplacement);
分割
string[] strs = Regex.Split(string input,string pattern);
四、C#使用正则的一些示例
1.验证邮编
Regex.IsMatch(input,"^[0-9]{6}$");
2.验证身份证号码
Regex.IsMatch(input," ^[1-9][0-9]{14}([0-9]{2}[0-9xX])?$");
3.验证邮箱
Regex.IsMatch(input,"^[a-zA-Z0-9_.\\-]+@[a-zA-Z\\-0-9]+(\\.[a-zA-Z]+){1,2}$");
4.手机号验证
Regex.IsMatch(input,"^[1-9][0-9]{3}[\\-][0-9]{2}[\\-][0-9]{2}$");
5.从html中提取邮箱
string fileContent =File.ReadAllText("email_天涯社区.htm");
MatchCollectionmc = Regex.Matches(fileContent,"([-a-zA-Z0-9_.]+)@([-a-zA-Z0-9]+(\\.[a-zA-Z]+){1,2})");
foreach(Match item in mc)
{
Console.WriteLine(item.Value +"\t" + item.Groups[1].ToString() + "\t" +item.Groups[2].ToString());
}
Console.ReadKey();
6.提取文件中行的首词和尾词
文件中的内容:
string msg = File.ReadAllText("英文句子提取.txt");
//首词
MatchCollectionm = Regex.Matches(msg, @"^[-a-zA-Z]+\b", RegexOptions.Multiline);
foreach(Match item in m)
{
Console.WriteLine(item.Value);
}
Console.WriteLine("---------------------------------------------------");
//末尾单词
MatchCollectionma = Regex.Matches(msg, @"\b[-a-zA-Z.]+\r?$",RegexOptions.Multiline);
foreach(Match item in ma)
{
Console.WriteLine(item.Value);
}
Console.ReadKey();
提取结果:
7.正则中的替换
string msg = "我的生日是28/05/1989,耶!我的生日是28/05/1989,耶!我的生日是28/05/1989,耶!我的生日是28/05/1989,耶!"; // 替换成我的生日1989-05-28;
//使用()进行分钟,使用$组号获取分组内容进行替换
stringnewMsg = Regex.Replace(msg, @"(\d{2})/(\d{2})/(\d{4})","$3-$2-$1", RegexOptions.ECMAScript);
Console.WriteLine(newMsg);
Console.ReadKey();
结果:
string msg = "百度:http://www.baidu.com;谷歌:http://www.google.com.hk;雅虎:http://www.yahoo.com";
stringnewPath = Regex.Replace(msg, "[a-zA-Z]+://[a-zA-Z.]+", "
Console.WriteLine(newPath);
Console.ReadKey();
结果:
8.将13888888888替换成138****8888
stringnumber = "13888888888";
stringnewNumber = Regex.Replace(number, "([1-9][0-9]{2})(([0-9]{4}){2})","$1****$3");
Console.WriteLine(newNumber);
Console.ReadKey();
结果:
9.将[email protected];[email protected]替换成***@163.com;******@qq.com
stringmsg = "[email protected];[email protected]";
stringnewMsg = Regex.Replace(msg,@"([-a-zA-Z0-9_.]+)(@[-a-zA-Z0-9.]+(\.[a-zA-Z0-9]+){1,2})",ReplaceName);
Console.WriteLine(newMsg);
Console.ReadKey();
staticstring ReplaceName(Match match)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i { sb.Append("*"); } returnsb.Append(match.Groups[2].Value.ToString()).ToString(); } 结果: 10.\b的使用 1.替换句子中的单词:The dayafter tomorrow is my wedding day.The row we are looking for is .row. number 10. string msg = "替换句子中的单词:The day after tomorrow is my wedding day.The row we arelooking for is .row. number 10."; stringnewMsg = Regex.Replace(msg, @"\brow\b", "line"); Console.WriteLine(newMsg); Console.ReadKey(); 结果: 2.练习:Hi,how are you?Welcome to our country!请提取出3个字母的单词。 string msg = "练习:Hi,how are you?Welcome to our country!请提取出3个字母的单词。"; MatchCollectionmc = Regex.Matches(msg, @"\b[a-zA-z]{3}\b"); foreach(Match item in mc) { Console.WriteLine(item.Value); } Console.ReadKey(); 结果: 11.反向引用 1.将“杨杨杨杨杨白白白白白白白老老老老”变成“杨白老” string str = "杨杨杨杨杨白白白白白白白老老老老"; /// \1、\2、\3、....这种写法就叫做“反向引用”, ///在字符串替换中引用分组使用$1方式, ///在正则表达式内部引用分组信息使用\1这种方式 stringnewstr = regex.replace(str, @"(.)\1+", "$1"); console.writeline(newstr); console.readKey(); 结果: 2.从文本中找到英文单词中有重叠字母的单词,比如sheep、zool string str = File.ReadAllText("英汉词典TXT格式.txt",Encoding.GetEncoding("gb2312")); MatchCollectionmatches = Regex.Matches(str,@"\b[a-zA-Z]*([-a-zA-Z'])\1[a-zA-Z]*\b"); foreach(Match item in matches) { Console.WriteLine(item.Value); } Console.ReadKey(); 结果: 12.环视: 1.环视实现找出字符串中所有5位电话号码 string str = "苏坤:18999141265蒋坤:13111111111杨中科:13488888888电信:10000移动:10086联通:10010工行:95588传智播客010-82935100传智播客:010-82935150"; MatchCollectionmatches = Regex.Matches(str, @"(?
foreach(Match item in matches) { Console.WriteLine(item.Value); } Console.ReadKey(); 结果: 2.给数字加逗号,如1,234,456 Console.WriteLine("请输入数字,我给你加分号"); stringnumber = Console.ReadLine(); stringnewNumber = Regex.Replace(number, @"(?<=\d)(?=(\d{3})+(?!\d))",",", RegexOptions.ECMAScript); Console.WriteLine(newNumber); Console.ReadKey(); 结果: 13.提取ABAB示例 string msg = "今天是个好日子:运动运动哈哈阿萨德愈演愈烈阿萨德,阿萨如火如荼德前往俄清清白白前往俄浩浩荡荡阿萨德平平安安愈演愈烈高高兴兴安安静静 安安稳稳 比比划划 吵吵闹闹 吵吵嚷嚷 吃吃喝喝 匆匆忙忙 大大方方 大大咧咧 地地道道 疯疯癫癫 缝缝补补 服服帖帖 高高兴兴 鬼鬼祟祟 含含糊糊 浩浩荡荡 昏昏沉沉 家家户户 简简单单 磕磕碰碰 口口声声 哭哭啼啼 快快乐乐 拉拉扯扯 老老实实 冷冷清清 了了草草 零零碎碎 慢慢腾腾 忙忙碌碌 明明白白 男男女女 蓬蓬勃勃 平平安安 平平常常 平平淡淡 平平静静 平平稳稳 婆婆妈妈 破破烂烂 普普通通 千千万万 前前后后 勤勤恳恳 清清白白 清清楚楚 认认真真 时时处处 时时刻刻 实实在在 世世代代 松松垮垮 松松散散 随随便便 踏踏实实 坛坛罐罐 堂堂正正 头头脑脑 吞吞吐吐 拖拖拉拉 完完全全 稳稳当当 熙熙攘攘 嘻嘻哈哈 形形色色 严严实实 摇摇晃晃 隐隐约约 郁郁葱葱 原原本本 扎扎实实 整整齐齐 支支吾吾 仔仔细细 祖祖辈辈挨家挨户 百战百胜 百发百中 半工半读 暴饮暴食 本乡本土 不折不扣 不卑不亢 不管不顾 不慌不忙 不骄不躁 不亢不卑 不明不白 不偏不倚 不屈不挠 不三不四 不痛不痒 不上不下 不闻不问 常来常往 潮涨潮落 炒买炒卖 彻头彻尾 称王称霸 成名成家 诚惶诚恐 诚心诚意 此情此景 从重从快 从难从严 大包大揽 大风大浪 大轰大嗡 大起大落 大是大非 多才多艺 多姿多彩 多灾多难 非亲非故 风言风语 古色古香 合情合理 忽高忽低 糊里糊涂 互利互惠 互谅互让 绘声绘色 昏头昏脑 活灵活现 或明或暗 戒骄戒躁 可歌可泣 苦思苦想 冷言冷语 离心离德 利国利民 满打满算 没头没脑 民风民俗 难分难解 难解难分 难舍难分 能屈能伸 偏听偏信 平起平坐 群策群力 人来人往 人山人海 如火如荼 如醉如痴 入情入理 若即若离 若明若暗 善始善终 时隐时现 缩手缩脚 所作所为 同工同酬 同心同德 徒子徒孙 土里土气 惟妙惟肖 稳扎稳打 我行我素 无法无天 无声无息 无缘无故 无忧无虑 无影无踪 疑神疑鬼 亦步亦趋 有条有理 有头有尾 有始有终 有勇有谋 有滋有味 又红又专 愈演愈烈 怨天怨地 载歌载舞 再接再厉 真刀真枪 整日整夜 知己知彼 自高自大 自觉自愿 自给自足 自卖自夸 自暴自弃 自私自利 自生自灭 自言自语 自作自受 作威作福大腹便便 文质彬彬 比比皆是 彬彬有礼 勃勃生机乐呵乐呵惟妙惟肖一二一二三思三思五六五六哈哈哈哈噢噢噢噢耶耶耶耶"; MatchCollectionmc = Regex.Matches(msg, @"(.)\1(?!\1)(.)\2"); foreach(Match item in mc) { Console.WriteLine(item.Value); } Console.ReadKey(); 结果: 14.提取ABAB string msg = "今天是个好日子:运动运动哈哈阿萨德愈演愈烈阿萨德,阿萨如火如荼德前往俄清清白白前往俄浩浩荡荡阿萨德平平安安愈演愈烈高高兴兴安安静静 安安稳稳 比比划划 吵吵闹闹 吵吵嚷嚷 吃吃喝喝 匆匆忙忙 大大方方 大大咧咧 地地道道 疯疯癫癫 缝缝补补 服服帖帖 高高兴兴 鬼鬼祟祟 含含糊糊 浩浩荡荡 昏昏沉沉 家家户户 简简单单 磕磕碰碰 口口声声 哭哭啼啼 快快乐乐 拉拉扯扯 老老实实 冷冷清清 了了草草 零零碎碎 慢慢腾腾 忙忙碌碌 明明白白 男男女女 蓬蓬勃勃 平平安安 平平常常 平平淡淡 平平静静 平平稳稳 婆婆妈妈 破破烂烂 普普通通 千千万万 前前后后 勤勤恳恳 清清白白 清清楚楚 认认真真 时时处处 时时刻刻 实实在在 世世代代 松松垮垮 松松散散 随随便便 踏踏实实 坛坛罐罐 堂堂正正 头头脑脑 吞吞吐吐 拖拖拉拉 完完全全 稳稳当当 熙熙攘攘 嘻嘻哈哈 形形色色 严严实实 摇摇晃晃 隐隐约约 郁郁葱葱 原原本本 扎扎实实 整整齐齐 支支吾吾 仔仔细细 祖祖辈辈挨家挨户 百战百胜 百发百中 半工半读 暴饮暴食 本乡本土 不折不扣 不卑不亢 不管不顾 不慌不忙 不骄不躁 不亢不卑 不明不白 不偏不倚 不屈不挠 不三不四 不痛不痒 不上不下 不闻不问 常来常往 潮涨潮落 炒买炒卖 彻头彻尾 称王称霸 成名成家 诚惶诚恐 诚心诚意 此情此景 从重从快 从难从严 大包大揽 大风大浪 大轰大嗡 大起大落 大是大非 多才多艺 多姿多彩 多灾多难 非亲非故 风言风语 古色古香 合情合理 忽高忽低 糊里糊涂 互利互惠 互谅互让 绘声绘色 昏头昏脑 活灵活现 或明或暗 戒骄戒躁 可歌可泣 苦思苦想 冷言冷语 离心离德 利国利民 满打满算 没头没脑 民风民俗 难分难解 难解难分 难舍难分 能屈能伸 偏听偏信 平起平坐 群策群力 人来人往 人山人海 如火如荼 如醉如痴 入情入理 若即若离 若明若暗 善始善终 时隐时现 缩手缩脚 所作所为 同工同酬 同心同德 徒子徒孙 土里土气 惟妙惟肖 稳扎稳打 我行我素 无法无天 无声无息 无缘无故 无忧无虑 无影无踪 疑神疑鬼 亦步亦趋 有条有理 有头有尾 有始有终 有勇有谋 有滋有味 又红又专 愈演愈烈 怨天怨地 载歌载舞 再接再厉 真刀真枪 整日整夜 知己知彼 自高自大 自觉自愿 自给自足 自卖自夸 自暴自弃 自私自利 自生自灭 自言自语 自作自受 作威作福大腹便便 文质彬彬 比比皆是 彬彬有礼 勃勃生机乐呵乐呵惟妙惟肖一二一二三思三思五六五六哈哈哈哈噢噢噢噢耶耶耶耶"; MatchCollectionmc = Regex.Matches(msg, @"(.)(?!\1)(.)\1\2"); foreach(Match item in mc) { Console.WriteLine(item.Value); } Console.ReadKey(); 结果: 15.正则分割 stringmsg = "*ab+cd^efgh--bu--234-345--[[..6m8...["; string[]strs = Regex.Split(msg, @"[\*\+\^\-\[\.]"); foreach(string item in strs) { if (string.IsNullOrEmpty(item)) continue; Console.WriteLine(item); } Console.ReadKey(); 结果: