C#轻松入门(五)正则表达式

来源:互联网 发布:手机淘宝微淘怎么玩 编辑:程序博客网 时间:2024/05/21 16:51
第五章 正则表达式与Internet操作

正则表达式提供了功能强大、灵活而又高效的方法来处理文本。
            正则表达式的全面模式匹配表示法使您可以快速分析大量文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。
            对于处理字符串的许多应用程序而言正则表达式是不可缺少的工具。
5.1  正则表达式简介
正则表达式:用某种模式去匹配指定字符串的一种表示方式。正则表达式由普通字符和元字符组成。
普通字符:常使用的字符如字母、数字、汉字等
元字符:可以匹配某些字符形式的具有特殊含义的字符,其作用类似于DOS命令使用的通配符。
正则表达式基本书写符号
正则表达式限定符
3. 匹配字符集
  (1) 匹配字符集是预定义的用于正则表达式中的符号集。
  (2) 如果字符串与字符集中的任何一个字符相匹配,它就会找到这个匹配项。
字符详解请查看 正则表达式符号解释
4. 分组构造
5. 正则表达式举例
非负整数:“^/d+$ ”
正整数: “ ^[0-9]*[1-9][0-9]*$”
非正整数: “ ^((-/d+)|(0+))$”
整数: “ ^-?/d+$”
英文字符串: “ ^[A-Za-z]+$”
英文字符数字串: “ ^[A-Za-z0-9]+$”
英数字加下划线串: “^/w+$”
E-mail地址:“^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$”
URL:“^[a-zA-Z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/s*)?$”

5.2  Regex类

Regex 类表示不可变(只读)正则表达式类。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。
    Regex 类在System.Text.RegularExpressions命名空间下。
    这里仅介绍IsMatch方法。
IsMatch方法:正则表达式在输入字符串中是否找到匹配项。
该方法有四种重载的形式:
public bool IsMatch(string str);
     表示在构造函数中指定的正则表达式在str中是否找到匹配项。
public bool IsMatch(string str, int start);
   表示在构造函数中指定的正则表达式在str的指定起始位置开始是否找到匹配项。参数start表示开始搜索的字符位置。
public static bool IsMatch(string str, string pattern);
    表示使用pattern参数中指定的正则表达式是否在str中找到匹配项。
public static bool IsMatch(string str, string pattern, RegexOptions options);
    表示使用pattern参数中指定的正则表达式和options枚举提供的匹配选项在input中是否找到匹配项。其中options是RegexOption枚举值的按位“或”组合。
例:
           Regex r = new Regex(@"[0-9a-z]{3,5}");
            
string[] tests = {"abc""123456""(aa22bb33)""ab"};
            
foreach (string test in tests)
            
{
                
if (r.IsMatch(test))
                
{
                    Console.WriteLine(
"{0}中有匹配的项", test);
                }

                
else
                
{
                    Console.WriteLine(
"{0}中没有匹配的项", test);
                }

            }

5.3  Match类

Match类表示单个正则表达式匹配操作的结果,得到的结果是只读的。该类没有公共构造函数,而是用Regex对象的Match方法返回的结果创建该类的对象。
例如:
     Regex r = new Regex("abc");
     Match m 
= r.Match("123abc456");
     
if (m.Success)
     

         Console.WriteLine(
"找到匹配位置:" + m.Index);
         Console.WriteLine(
"找到匹配结果:" + m.Value);
     }

运行结果:
找到匹配位置:3
找到匹配结果:abc
5.4  MatchCollection类
MatchCollection类表示成功的非重叠匹配的序列,得到的集合是只读的。该类同样没有公共构造函数,而是用Regex.Matches方法返回的结果创建该类的对象。
例如:
     Regex r = new Regex("abc");
    MatchCollection mc 
= r.Matches("123abc4abcd");
    
int count = mc.Count;
    String[] results 
= new String[count];
    
int[] matchPosition = new int[count];
    
for (int i = 0; i < count; i++)
    
{
         results[i] 
= mc[i].Value;
         matchPosition[i] 
= mc[i].Index;
         Console.WriteLine(
"第{0}个匹配结果:{1},位置:{2}",i+1, results[i],      matchPosition[i]);
    }

运行结果:
第1个匹配结果:abc,位置:3
第2个匹配结果:abc,位置:7
5.5  Group类
Group类表示单个捕获组的结果。当与正则表达式匹配的子字符串有多组时,可以使用该类得到某一组的结果。例如:
            string text = "One car red car blue car";
              
string pat = @"(w+)s+(car)";
             Regex r 
= new Regex(pat, RegexOptions.IgnoreCase);
             Match m 
= r.Match(text);
             
int matchCount = 0;
             
while (m.Success)
             
{
                  Console.WriteLine(
"Match" + (++matchCount));
                  
for (int i = 1; i <= 2; i++)
                  
{
                     Group g 
= m.Groups[i];
                     Console.WriteLine(
string.Format("Group{0}='{1}'", i, g));
                     CaptureCollection cc 
= g.Captures;
        
for (int j = 0; j < cc.Count; j++)
                
{
                    Capture c 
= cc[j];
                    Console.WriteLine(
string.Format(
                         
"Capture{0}='{1}', Position={2}", j, c, c.Index));
                }

            }

            m 
= m.NextMatch();
        }

        Console.ReadLine();

输出结果:
Match1
Group1='One'
Capture0='One', Position=0
Group2='car'
Capture0='car', Position=4
Match2
Group1='red'
Capture0='red', Position=8
Group2='car'
Capture0='car', Position=12
Match3
Group1='blue'
Capture0='blue', Position=16
Group2='car'
Capture0='car', Position=21