首页 > 代码库 > C# 正则表达式(一)

C# 正则表达式(一)

       首先来复习一下正则表达式的基础知识,本篇文章分为2个部分,第一个部分复习正则表达式中的元字符和简写表达式,第二部分复习正则表达式的匹配和提取。

1.正则表达式中的元字符和简写表达式

    ".":它匹配除\n之外的任何单个字符.

    "{n,}",表示前面的字符至少出现n次,最多不限。

    "{n,m}"表示前面的字符至少出现n次,最多出现m次。

    "+":加号匹配紧挨着它前面的字符出现1次或多次.用上面的表达式可以这么写:{1,}

    "*":星号匹配紧挨着它前面的字符出现0次或多次.用上面的表达式可以这么写:{0,}

    "?":问号匹配紧挨着它前面的字符出现0次或1次.用上面的表达式可以这么写:{0,1}

    []:匹配括号中的任何一个字符(范围,字符集合).如:匹配英文26个字母的大小写,可在括号中这么写:[a-zA-Z];匹配所有阿拉伯数字,可在括号中这么写:[0-9]

         中括号中的"."表示一个普通点,如果要包含其他含义,则需要转义(\.).

    "|",它表示将两个匹配条件进行逻辑“或”运算,运算级别最低。

    "()",它用来提升表达式的优先级,另外一个作用是提取分组。

完全限定符:

    "^",它表示一个字符串的开始,另外一个作用是取非([^0-9])。

    "$",它表示一个字符串的结束。

 

简写表达式:

     "\d",它匹配所有阿拉伯数字,即[0-9],因为.net采用Unicode编码,它也匹配全角数字,如果不希望匹配全角数字,请指定RegexOptions.ECMAScript(采用ASCII码匹配)或[0-9]。

     "\D",它是"\d"的反面,即匹配除\d之外的其他字符。

     "\s",它匹配所有的空白符(包含空格、回车、制表符)。

     "\S",它是"\s"的反面,即匹配除\s之外的其他字符。

     "\w",匹配字母或数字或下划线或汉字,即能组成单词的字符,除%&#@!$等字符。[a-zA-Z0-9_汉字] (unicode字符)

     "\W",它是"\w"的反面,即匹配除\w之外的其他字符。

     "\b",它表示单词的边界。

忽略所有的元字符,类似于C#中的@符号:string s=Regex.Escape(@"\d{5,7}");
 
2.正则表达式的匹配
    判断是否匹配:Regex.IsMatch(“字符串”,”正则表达式”);此类问题要想的是与之匹配的正则表达式如何写(找规律),正则表达式写好了,问题就解决了。
下面给出几个案例: 
 1 #region 验证身份证号是否正确(规律,第一位不能是0;如果是15位,则全数字,如果是18位,则最后一位即可能是数字也可能是英文字母X) 2             string strPattr = @"^[1-9][0-9]{14}([0-9]{2}[0-9X])?$"; 3             while (true) 4             { 5                 Console.WriteLine("请输入你的身份证号:"); 6                 string sCode = Console.ReadLine(); 7                 if (Regex.IsMatch(sCode, strPattr)) 8                 { 9                     Console.WriteLine("true");10                 }11                 else12                 {13                     Console.WriteLine("false");14                 }15             }16             #endregion
 1 #region 验证邮政编码是否正确 2             string strPattr = @"^[1-9][0-9]{5}$"; 3             while (true) 4             { 5                 Console.WriteLine("请输入你所在地邮政编码:"); 6                 string sCode = Console.ReadLine(); 7                 if (Regex.IsMatch(sCode, strPattr)) 8                 { 9                     Console.WriteLine("true");10                 }11                 else12                 {13                     Console.WriteLine("false");14                 }15             }16             #endregion
View Code
 1 #region 验证所有电话号码是否正确 2             //1.手机号:以130-139、150-159、186-189这3个号段,后面8位数字。[1][3|5][0-9]{9}|[1][8][6-9][0-9]{8} 3             //2.座机号:区号以0开头,后面跟2-3位数字,号码为7-8位数字。[0][1-9][0-9]{1,2}(\-)?[0-9]{7,8} 4             //3.400、800电话:以4或8开头,紧跟2个0,后面为7位数字。[4|8][0]{2}(\-)?[0-9]{7} 5             //4.5位数字的客服电话 [1-9][0-9]{4} 6  7             string strPattr = @"^([1][3|5][0-9]{9}|[1][8][6-9][0-9]{8}|[0][1-9][0-9]{1,2}(\-)?[0-9]{7,8}|[4|8][0]{2}(\-)?[0-9]{7}|[1-9][0-9]{4})$"; 8             while (true) 9             {10                 Console.WriteLine("请输入您的联系方式:");11                 string sCode = Console.ReadLine();12                 if (Regex.IsMatch(sCode, strPattr))13                 {14                     Console.WriteLine("true");15                 }16                 else17                 {18                     Console.WriteLine("false");19                 }20             }21             #endregion
View Code
 1 #region 验证邮箱格式是否合法 2             string strPattr = @"^[-0-9a-zA-Z_]+@[a-zA-Z0-9]+(\.[a-zA-Z]+){1,2}$"; 3             while (true) 4             { 5                 Console.WriteLine("请输入您的电子邮箱地址:"); 6                 string sEmail = Console.ReadLine(); 7                 if (Regex.IsMatch(sEmail, strPattr)) 8                 { 9                     Console.WriteLine("true");10                 }11                 else12                 {13                     Console.WriteLine("false");14                 }15             }16             #endregion
View Code
 1 #region 匹配IP地址,4段用.分割的最多三位数字。 192.168.54.77是正确的,而333.333.333.333是错误的。 2             string sIp = "192.168.54.77"; 3             string strPattr = @"^([1][0-9]{2}|[2][0-5]{2}|[3|4|5|6|7|8|9][0-9])(\.([1][0-9]{2}|[2][0-5]{2}|[3|4|5|6|7|8|9][0-9])){3}$"; 4  5             if (Regex.IsMatch(sIp, strPattr)) 6             { 7                 Console.WriteLine("true"); 8             } 9             else10             {11                 Console.WriteLine("false");12             }13             Console.ReadKey();14             #endregion
View Code
 1 #region 判断是否是合法的日期格式“2008-08-08”。四位数字-两位数字-两位数字 2             string strPatt = @"^([1][0-9]{3}|[2][0][0-9]{2})(\-)?([0][1-9]|[1][0-2])(\-)?([0][1-9]|[1|2][0-9]|[3][0-1])$"; 3             string sYear = "20140807"; 4  5             if (Regex.IsMatch(sYear, strPatt)) 6             { 7                 Console.WriteLine("true"); 8             } 9             else10             {11                 Console.WriteLine("false");12             }13             Console.ReadKey();14             #endregion
View Code
 1 #region 判断是否是合法的url地址,http://www.test.com/a.htm?id=3&name=aaa、ftp://127.0.0.1/1.txt 2             string strPatt = @"^.+://.+$"; 3             while (true) 4             { 5                 Console.WriteLine("请输入url地址:"); 6                 string sUrl = Console.ReadLine(); 7                 if (Regex.IsMatch(sUrl,strPatt)) 8                 { 9                     Console.WriteLine("true");10                 }11                 else12                 {13                     Console.WriteLine("false");14                 }15             }16             #endregion
View Code

 3.字符串提取

字符串提取:Regex.Match(“字符串”,“要提取的字符串的正则表达式”);//只能提取一个(提取一次)

字符串提取(循环提取所有): Regex.Matches(),(可以提取所有匹配的字符串。)

在用正则表达式做字符串提取时,正则中就不要写完全限定符(^、$)了。

 1 #region 从一个html中提取所有Email 2             string sEmail = File.ReadAllText("大家留下email交友吧_email_天涯社区.htm"); 3             string strPatt = @"[-a-zA-Z0-9_.]+@[a-zA-Z0-9]+(\.[a-zA-Z]+){1,2}"; 4             MatchCollection mc = Regex.Matches(sEmail, strPatt); 5             foreach (Match item in mc) 6             { 7                 if (item.Success) 8                 { 9                     Console.WriteLine(item.Value);10                 }11             }12             Console.WriteLine("找到匹配项"+mc.Count+"");13             Console.ReadKey();14             #endregion
View Code