码迷,mamicode.com
首页 > Windows程序 > 详细

C#学习(五)- 正则表达式等

时间:2015-04-20 13:10:04      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

1. 正则表达式

a. 什么是正则表达式?

  在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。正则表达式由literals(字面值)、metacharacters(元字符)两类字符组成。字面值是你想要通配的字符,元字符是正则表达式使用的特殊字符,像是一种命令,使正则表达式具有相应功能。

b. 正则表达式功能实例解析

  假设你在一篇英文小说里查找hi,你可以使用正则表达式hi。

  这几乎是最简单的正则表达式了,它可以精确匹配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以匹配hi,HI,Hi,hI这四种情况中的任意一种。

  不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。\b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格,标点符号或者换行来分隔的,但是\b并不匹配这些单词分隔字符中的任何一个,它只匹配一个位置

  这就是正则表达式的功能,在很多文本编辑器里,用于检索、替换那些符合某个模式的文本。

c. 在C#中使用正则表达式

  正则表达式在.Net就是用字符串表示,这个字符串格式比较特殊,无论多么特殊,在C#语言看来都是普通的字符串,具体什么含义由Regex类内部进行语法分析。

  C#中分别对应正则表达式的三个重要方法。

  1) IsMatch() 返回值为bool类型

    格式:Regex.IsMatch("字符串", "正则表达式");

    作用:判断字符串是否符合模板要求

     例如:bool b =Regex.IsMatch("bbbbg","^b.*g$");判断字符串是否以b开头且以g结尾,中间可以有其他字符,若正确返回true,否则else

  2) Match() 返回值为Match类型,只能匹配一个

    Matches() 返回值为MatchCollection集合类型,匹配所有符合的

    格式:Match match = Regex.Match("字符串", "正则表达式");

    或MatchCollection matches= Regex. Matches ("字符串", "正则表达式");

    作用:

      ①提取匹配的子字符串

      ②提取组。Groups的下标由1开始,0中存放matchvalue

例如:

1 Match match = Regex.Match("age=30", @"^(.+)=(.+)$");
2 if (match.Success){     
3     Console.WriteLine(match.Groups[0] .Value);//输出匹配的子字符串
4     Console.WriteLine(match.Groups[1] .Value);//获取第一个分组的内容
5     Console.WriteLine(match.Groups[2] .Value);//获取第二个分组的内容
6 }
1 MatchCollection matches = Regex.Matches("2010年10月10日", @"\d+");
2          for (int i = 0; i < matches.Count; i++)
3          {
4                 Console.WriteLine(matches[i].Value);
5          }

  3) Replace() 返回值为string

 1 //将所有的空格替换为单个空格
 2 string str = "   aa afds     fds  f ";
 3 str = Regex.Replace(str, @"\s+", " ");
 4 Console.WriteLine(str);
 5 
 6 string str = "hello“welcome to ”beautiful “China”";
 7 //hello"welcome to "beautiful "China"
 8 //$1表示引用第一组。$2表示用第二组。
 9 string strresult = Regex.Replace(str, "“(.+?)”", "\"$1\"");
10 Console.WriteLine(strresult);

 

贪婪与懒惰:

  当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.*b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。
  有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?。这样.*?就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复。

 

2. C#的async和await关键字

  C# 5.0中引入了async 和 await。这两个关键字可以让你更方便的写出异步代码。await 运算符应用于一个异步方法的任务挂起方法的执行,直到等待任务完成。任务表示正在进行的工作。

引用个例子:

 1 public class MyClass
 2 {
 3     public MyClass()
 4     {
 5         DisplayValue(); //这里不会阻塞
 6         System.Diagnostics.Debug.WriteLine("MyClass() End.");
 7     }
 8     public Task<double> GetValueAsync(double num1, double num2)
 9     {
10         return Task.Run(() =>
11         {
12             for (int i = 0; i < 1000000; i++)
13             {
14                 num1 = num1 / num2;
15             }
16             return num1;
17         });
18     }
19     public async void DisplayValue()
20     {
21         double result = await GetValueAsync(1234.5, 1.01);//此处会开新线程处理GetValueAsync任务,然后方法马上返回
22         //这之后的所有代码都会被封装成委托,在GetValueAsync任务完成时调用
23         System.Diagnostics.Debug.WriteLine("Value is : " + result);
24     }
25 }

上面在MyClass的构造函数里调用了async关键字标记的异步方法DisplayValue(),DisplayValue()方法里执行了 一个await关键字标记的异步任务GetValueAsync(),这个异步任务必须是以Task或者Task<TResult>作为返回 值的,而我们也看到,异步任务执行完成时实际返回的类型是void或者TResult,DisplayValue()方法里 await GetValueAsync()之后的所有代码都会在异步任务完成时才会执行。

DisplayValue()方法实际执行的代码如下:

1 public void DisplayValue()
2 {
3     System.Runtime.CompilerServices.TaskAwaiter<double> awaiter = GetValueAsync(1234.5, 1.01).GetAwaiter();
4     awaiter.OnCompleted(() =>
5         {
6             double result = awaiter.GetResult();
7             System.Diagnostics.Debug.WriteLine("Value is : " + result);
8         });
9 } 

可以看到,async和await关键字只是把上面的代码变得更简单易懂而已。

程序的输出如下:

MyClass() End.

Value is : 2.47032822920623E-322

 

参考内容:

http://www.cnblogs.com/youquan-deng/articles/csharp-regex.html
http://www.jb51.net/tools/zhengze.html#greedyandlazy
http://blog.csdn.net/tianmuxia/article/details/17675681

C#学习(五)- 正则表达式等

标签:

原文地址:http://www.cnblogs.com/yongheng20/p/4441197.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!