zoukankan      html  css  js  c++  java
  • C#学习(五)- 正则表达式等

    1. 正则表达式

    a. 什么是正则表达式?

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

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

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

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

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

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

    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

  • 相关阅读:
    top
    H3C系列之三层交换机系统版本升级
    关于惠普hp服务器开机时F10菜单变成F10 Function Disabled的解决方法
    linux登陆欢迎提示信息的设置
    H3C交换机如何配置管理VLAN
    H3C S3100交换机配置VLAN和远程管理
    设置思科设备console密码、enable密码、vty登录密码
    Windows Server2003本地用户的批量导入和导出(转)
    语音通信质量监测
    Android BaseAdapter加载多个不同的Item布局时出现UncaughtException in Thread main java.lang.ArrayIndexOutOfBoundsException: length=15; index=15
  • 原文地址:https://www.cnblogs.com/yongheng20/p/4441197.html
Copyright © 2011-2022 走看看