黑马程序员_正则表达式用法与练习

一个正则表达式就是由普通字符以及特殊字符(称为元字符)组成的字符串。

一、元字符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 }
提取组(提取黑马.net13期论坛帖子标题)
 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 }
字符串替换
原文地址:https://www.cnblogs.com/dlwcg/p/3614474.html