一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的字符串。
一、元字符1
. 匹配除 之外的任何单个字符。b.g能匹配big,bug,b g,不能匹配buug。
[] 匹配括号中的任何一个字符。b[aui]g能匹配bug,big,bag,不能匹配beg,baug。可以在括号中使用连字符“-”来指定字符的区间来简化表示。
[0-9]=[0123456789]
[a-z]=[abcdefg...xyz]
[A-Z]=[ABCDEFG...XYZ]
[0-9a-zA-Z]=任何大小字母和数字
| 将两个匹配条件进行逻辑“或”运算。'z|food'能匹配'z'或'food','(z|f)ood'能匹配'zood'或'food'
() 将()之间括起来的表达式定义为"组"(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。把一些字符表示为一个整体。改变优先级,定义提取组两个作用。
二、元字符2 限定符:限定前面的正则表达式出现的次数。
* 匹配零至多次在它之前的子表达式,和通配符*没有关系。'zo*'(等同于z(o)*)能匹配'z,zo,zoo'因此'.*'意味着能够匹配任意字符串'z(b|c)*'能匹配'zb,zbc,zcb,zccc,zbbbccc''z(ab)*'能匹配'z,zab,zabab'(用括号改变优先级)。
+ 匹配前面的子表达式一次或多次,和*对比(0到多次)。9+能匹配9,99,999等。'zo+'能匹配'zo,zoo',不能匹配'z'。
? 匹配前面的子表达式零次或一次,'do(es)'能匹配'do,does',一般用来匹配“可选部分”。(终止贪婪模式)
{n} 匹配确定的n次。'zo{2}'能匹配zoo。'e{2}'不能匹配'bed'中的'e',但是能匹配'seed'中的两个'e'。'seeeed'不可以。
{n,} 至少匹配n次。'e{2,}'不能匹配'bed'中的'e',但能匹配'seeeeeeeeed'中的所有'e'。
{n,m} 最少匹配n次且最多匹配m次。'e{1,3}'将匹配'seeeeeeeeed'中的前三个'e'。
三、元字符3 整行匹配
^ 匹配行开始符。'^regex'能匹配'regex我会用',但不能匹配'我会用regex'。
^ 另外一种意思,非!([^0-9])
$ 匹配行结束符。'浮云$'能匹配'一切都是浮云'的末尾,不能匹配'浮云呀'
四、简写表达式
d [0-9],代表一个数字
D [^0-9],代表非数字
s 代表换行符、Tab制表符等空白字符,(空格、回车、制表符)
S 代表非空白字符(a0%$@@)
w 匹配字母或数字或下划线或汉字,即能组成单词的字符;除%&#@!$等字符。
W 非w,等同于[^w]
d:digital;s:space;w:word 大写就是"非"
提取组输出结果:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Text.RegularExpressions; 6 7 namespace 匹配字符串 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string str1 = "4972988@qq.com"; 14 string str2 = "dlwcg@qq.com.cn"; 15 string str3 = "12345678901234567x"; 16 string str4 = "123456789012345"; 17 string regex1 = @"^w+@w+(.w+)+$"; //匹配E-mail 18 string regex2 = @"^(d{15}|d{17}[dxX])$"; //匹配ID 19 Console.WriteLine(Regex.IsMatch(str1, regex1).ToString()); //这里的Regex.IsMatch方法只返回一个bool结果 20 Console.WriteLine(Regex.IsMatch(str2, regex1).ToString()); 21 Console.WriteLine(Regex.IsMatch(str3, regex2).ToString()); 22 Console.WriteLine(Regex.IsMatch(str4, regex2).ToString()); 23 Console.ReadKey(true); 24 } 25 //输出结果 26 //True 27 //True 28 //True 29 //True 30 } 31 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Text.RegularExpressions; 6 7 namespace 提取字符串 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string res; 14 string str = "我一定要进入2014年4月15日的第13期黑马训练营.net班。"; 15 //Match只返回匹配的第一个匹配项 16 Match m = Regex.Match(str, @"d+"); 17 if (m.Success) 18 { 19 res = m.Value; 20 } 21 else 22 { 23 res = "没有匹配到"; 24 } 25 Console.WriteLine(res); 26 Console.ReadKey(true); 27 //输出结果: 28 //2014 29 } 30 } 31 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Text.RegularExpressions; 6 7 namespace 提取多个字符串 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string str = "我一定要进入2014年4月15日的第13期黑马训练营.net班。"; 14 MatchCollection mc = Regex.Matches(str, @"d+"); 15 foreach (Match temp in mc) 16 { 17 //在这里,mc为一个集合,temp为每一条匹配的结果,temp.Groups为每条匹配结果中的每一组结果 18 //因为只匹配了纯数字, 19 //所以在这里temp.Value与temp.Groups[0].Value的结果一样。 20 Console.WriteLine(temp.Groups[0].Value); 21 } 22 Console.ReadKey(true); 23 //输出结果 24 //2014 25 //4 26 //15 27 //13 28 } 29 } 30 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net; 6 using System.Text.RegularExpressions; 7 8 namespace 提取组 9 { 10 class Program 11 { 12 //提取黑马.net13期论坛帖子标题http://bbs.itheima.com/forum-174-1.html 13 //<a href="thread-107723-1-1.html" onclick="atarget(this)" class="s xst" target="_blank">关于ASP.Net+Unity3D十三期招生安排,报.Net必读!!!</a> 14 //<a href="thread-d+-1-1.html" onclick="atarget(this)" class="s xst">([^<]+)</a> 15 16 static void Main(string[] args) 17 { 18 WebClient wc = new WebClient(); 19 wc.Encoding = Encoding.UTF8; 20 string str = wc.DownloadString(@"http://bbs.itheima.com/forum-174-1.html"); 21 string regex = @"<a href=""thread-d+-1-1.html"" onclick=""atarget(this)"" class=""s xst"">([^<]+)</a>"; 22 MatchCollection mc = Regex.Matches(str, regex); 23 foreach (Match temp in mc) 24 { 25 //这里,mc为匹配的集合,temp为匹配的每一条结果,temp.Groups用()把每条结果分组了, 26 //Group[索引]这里的索引为组的序号,整体为0组,表达式里只有一个(),所以结果为Groups[0] 27 Console.WriteLine(temp.Groups[1].Value); 28 } 29 Console.ReadKey(true); 30 } 31 } 32 }
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Text.RegularExpressions; 6 7 namespace 字符串替换 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 string str = @"2014-03-20"; 14 str = Regex.Replace(str, @"(d+)-(d+)-(d+)", "$1年$2月$3日"); 15 Console.WriteLine(str); 16 Console.ReadKey(true); 17 //输出结果 18 //2014年03月20日 19 } 20 } 21 }