黑马程序员---c#正规表达式

         应该掌握的基础知识

  规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中,我们将假定你已经掌握了规则表达式的用法,尤其是Perl 5中表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集,因此,从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和.NET架构的基本知识。
  
  如果你没有规则表达式方面的知识,我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里·弗雷德尔编写的《掌握表达式》一书,对于希望深刻理解表达式的读者,我们强烈建议阅读这本书。
  
RegularExpression组合体

  regexp规则类包含在System.Text.RegularExpressions.dll文件中,在对应用软件进行编译时你必须引用这个文件,例如:

csc r:System.Text.RegularExpressions.dll foo.cs

命令将创建foo.exe文件,它就引用了System.Text.RegularExpressions文件。
  
名字空间简介

  在名字空间中仅仅包含着6个类和一个定义,它们是:
  
  Capture: 包含一次匹配的结果;
  CaptureCollection: Capture的序列;
  Group: 一次组记录的结果,由Capture继承而来;
  Match: 一次表达式的匹配结果,由Group继承而来;
  MatchCollection: Match的一个序列;
  MatchEvaluator: 执行替换操作时使用的代理;
  Regex: 编译后的表达式的实例。

  Regex类中还包含一些静态的方法:

  Escape: 对字符串中的regex中的转义符进行转义;
  IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值;
  Match: 返回Match的实例;
  Matches: 返回一系列的Match的方法;
  Replace: 用替换字符串替换匹配的表达式;
  Split: 返回一系列由表达式决定的字符串;
  Unescape:不对字符串中的转义字符转义。
  
简单匹配

  我们首先从使用Regex、Match类的简单表达式开始学习。
  
Match m = Regex.Match("abracadabra", "(a|b|r)+");
  
我们现在有了一个可以用于测试的Match类的实例,例如:if (m.Success)...
如果想使用匹配的字符串,可以把它转换成一个字符串:
  
Console.WriteLine("Match="+m.ToString());
  
这个例子可以得到如下的输出: Match=abra。这就是匹配的字符串了。
  
字符串的替换

  简单字符串的替换非常直观。例如下面的语句:
  
string s = Regex.Replace("abracadabra", "abra", "zzzz");
  
它返回字符串zzzzcadzzzz,所有匹配的字符串都被替换成了zzzzz。

  现在我们来看一个比较复杂的字符串替换的例子:
  
string s = Regex.Replace(" abra ", @"^\s*(.*?)\s*$", "$1");
  
这个语句返回字符串abra,其前导和后缀的空格都去掉了。
  
  上面的模式对于删除任意字符串中的前导和后续空格都非常有用。在C#中,我们还经常使用字母字符串,在一个字母字符串中,编译程序不把字符“ \” 作为转义字符处理。在使用字符“\”指定转义字符时,@"..."是非常有用的。另外值得一提的是$1在字符串替换方面的使用,它表明替换字符串只能包含被替换的字符串。 
  

 

罗马数字

string p1 = "^m*(d?c{0,3}|c[dm])" + "(l?x{0,3}|x[lc])(v?i{0,3}|i[vx])$";
  
    string t1 = "vii";
  
    Match m1 = Regex.Match(t1, p1);
 
   
交换前二个单词

string t2 = "the quick brown fox";
  
    string p2 = @"(\S+)(\s+)(\S+)";
  
    Regex x2 = new Regex(p2);
  
    string r2 = x2.Replace(t2, "$3$2$1", 1);

   
关健字=值

string t3 = "myval = 3";
  
    string p3 = @"(\w+)\s*=\s*(.*)\s*$";
  
    Match m3 = Regex.Match(t3, p3);

   
实现每行80个字符

string t4 = "********************"
  
     + "******************************"
  
     + "******************************";
  
    string p4 = ".{80,}";
  
    Match m4 = Regex.Match(t4, p4);

   
月/日/年 小时:分:秒的时间格式

string t5 = "01/01/01 16:10:01";
  
    string p5 = @"(\d+)/(\d+)/(\d+) (\d+):(\d+):(\d+)";
  
    Match m5 = Regex.Match(t5, p5); 

   

   
扩展16位转义符

string t7 = "%41"; // capital A
  
    string p7 = "%([0-9A-Fa-f][0-9A-Fa-f])";
  
    string r7 = Regex.Replace(t7, p7, HexConvert);
 
   
   
删除字符串中开始和结束处的空格

string t9a = " leading";
  
    string p9a = @"^\s+";
  
    string r9a = Regex.Replace(t9a, p9a, "");
  
    string t9b = "trailing ";
  
    string p9b = @"\s+$";
  
    string r9b = Regex.Replace(t9b, p9b, "");
 
   
在字符\后添加字符n,使之成为真正的新行

string t10 = @"\ntest\n";
  
    string r10 = Regex.Replace(t10, @"\\n", "\n");
 
   
转换IP地址

string t11 = "55.54.53.52";
  
    string p11 = "^" +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])\." +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])\." +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])\." +
  
     @"([01]?\d\d|2[0-4]\d|25[0-5])" +
  
     "$";
  
    Match m11 = Regex.Match(t11, p11);
 
   
删除文件名包含的路径

string t12 = @"c:\file.txt";
  
    string p12 = @"^.*\\";
  
    string r12 = Regex.Replace(t12, p12, "");
 
   
联接多行字符串中的行

string t13 = @"this is
  
    a split line";
  
    string p13 = @"\s*\r?\n\s*";
  
    string r13 = Regex.Replace(t13, p13, " ");

   
提取字符串中的所有数字

string t14 = @"
  
    test 1
  
    test 2.3
  
    test 47
  
    ";
  
    string p14 = @"(\d+\.?\d*|\.\d+)";
  
    MatchCollection mc14 = Regex.Matches(t14, p14);
 
   
找出所有的大写字母

string t15 = "This IS a Test OF ALL Caps";
  
    string p15 = @"(\b[^\Wa-z0-9_]+\b)";
  
    MatchCollection mc15 = Regex.Matches(t15, p15);
 
   
找出小写的单词

string t16 = "This is A Test of lowercase";
  
    string p16 = @"(\b[^\WA-Z0-9_]+\b)";
  
    MatchCollection mc16 = Regex.Matches(t16, p16);
 
   
找出第一个字母为大写的单词

string t17 = "This is A Test of Initial Caps";
  
    string p17 = @"(\b[^\Wa-z0-9_][^\WA-Z0-9_]*\b)";
  
    MatchCollection mc17 = Regex.Matches(t17, p17);

   
找出简单的HTML语言中的链接

string t18 = @"
  
    <html>
  
    <a href=""first.htm"">first tag text</a>
  
    <a href=""next.htm"">next tag text</a>
  
    </html>
  
    ";
  
    string p18 = @"<A[^>]*?HREF\s*=\s*[""']?" + @"([^'"" >]+?)[ '""]?>";
  
    MatchCollection mc18 = Regex.Matches(t18, p18, "si");

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值