隐藏

C#语言之字符串和正则表达式

发布:2022/7/3 19:25:53作者:管理员 来源:本站 浏览次数:843



本文将完成以下两个目标:


一、创建字符串;


二、正则表达式;


首先,我先来介绍一下System.String类:


System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作。


使用运算符重载可以连接字符串:


string str1 = "hello";            //return "hello"

str1 +=",C#";                     //return "hello,C#"

string str2 = str1+"!";         //return "hello,C#!"


C#还允许类似于索引器的语法来提取指定的字符:


string s = "hello";

char ch = s[4];         //索引从0开始

Console.WriteLine(ch);  //输出为o            


另外,String类中还有许多实用的方法,例如:


Compare方法:比较字符串的内容,判断某些字符是否相等


返回参数:


大于0:s1大于s2;


等于0:s1等于s2;


小于0:s1小于s2;


string s1 = "hello";

string s2 = "hello";

int i = String.Compare(s1, s2);   //比较字符串的位置,此用法为String类调用的方法,参数为两个字符串,如果仅比较两个字符串是否相等,可以用s1.Equlas(s2)方法实现

Console.WriteLine(i); //输出 0()


Split方法:在出现给定字符串的地方,把字符串分割为一个字符串数组


string s1 = "hello";

string[] s3= s1.Split('e');

foreach (string s in s3)

{

     Console.WriteLine(s); //输出为 h

                           //      llo

}        


Substring方法:在字符串中检索给定位置的子字符串


    string s1 = "hello";

string s3= s1.Substring(0,3);    //第一个参数为从索引为几开始,第二个参数为取多长

Console.WriteLine(s3);         //输出为 hel


这个方法有好多参数,具体用法可以自己用VS查看一下。打出这个方法之后,参数会自动提示。


ToLower方法:把字符串转化为小写


ToUpper方法:把字符串转化为大写


Trim方法:在输入数据时比较实用,可以删除首尾的空格,以便与数据库内容匹配。


此外,还有许许多多的方法很实用,如果用得到,可以参考String类的中文文档。

一、创建字符串:


我们来说一下为什么我们要创建字符串,前面我们已经说到了,表面上str1可以通过运算符重载的方式在原本字符串的内容上修改或追加内容,但其实并非如此,因为字符串是不可变的,一个字符串对象一旦创建,值就不能再更改(在不使用不安全代码的情况下)。其实本质上是创建一个新的字符串,将最初的文本复制到这个新的字符串中,再加上额外的文本,然后更新存储在变量str1的地址,使变量正确的指向新的字符串对象,其实这本身并没有什么,但是如果我们要对字符串做大量的修改操作,这将大大降低性能和效率。例如,假定要对一个很长的字符串编码,在字母表中,用Ascii码靠后的字符替代其中的每个字母(标点符号除外),作为非常简单的加密模式的一部分。完成这个任务的方式有好几种,最简单最高效的一种是(假定使用String类):使用String.Replace()方法,该方法把字符串中指定的子字符串用另一个字符串替换。使用该方法时将创建非常多的字符串对象。如此,如果使用字符串频繁的进行文字处理,应用程序将会遇到严重的性能问题。


为了解决这类问题,C#改为使用System.Text.StringBuilder类,StringBuilder类中的方法很少,仅限于处理替换和追加或删除字符串中的文本,但是,他的工作效率非常高。


StringBuilder的主要方法如下:


Append方法:给当前字符串追加一个字符串


AppendFormat方法:追加特定格式的字符串


Insert方法:在当前字符串中插入一个字符串


Remove方法:从当前字符串中删除字符


Replace方法:在当前字符串中,用某个字符全部替换另一个字符,或者用一个子字符串全部替换另一个字符串。


ToString方法:返回当前强制转换为System.String对象的字符串


Remove和Replace的例子:其他的例子大家可以尝试一下。


 StringBuilder sb = new StringBuilder("lalala");

 sb.Replace('a', 'g');         //用字符g替换a

 Console.WriteLine(sb.ToString());   //输出 lglglg

 sb.Remove(0,5);            //从索引0开始,删除5个字符

 Console.WriteLine(sb.ToString());   //输出 a


二、正则表达式


正则表达式语言是一种专门用于字符串处理的语言。 它包含两个功能:


   一组用于标识字符类型的转义代码。例如,* 代表任意字符串。

   一个系统,在搜索操作中,它把子字符串和中间结果的各个部分组合起来。


使用正则表达式,可以对字符串执行许多复杂而高级的操作,例如 :


   识别(标记或删除)字符串中所有重复的单词

   等等......


我们先来看一下所有的正则表达式模式:


1.字符转义:


2.字符类


3.定位点


4.分组构造


5.限定符


6.反向引用构造


7.替换构造


8.替换


9.其他构造


当我们需要哪些模块时,我们可以再去参考,详细的模块例子请参考msdn帮助文档。

使用方法:


使用正则表达式处理文本的中心构件是正则表达式引擎,该引擎在 .NET Framework 中由 System.Text.RegularExpressions. Regex 对象表示。


因此,我们先来看一看Regex的相关知识。


我们需要匹配,捕获和组合。Regex通过Group类和 Capture类支持组和捕获。GroupCollection类和CaptureCollection类分别表示组和捕获的集合,Match类提供一个Groups属性,他返回相应的GroupCollection对象。Group类也相应的实现了一个Capture属性,该属性返回CaptureCollection对象,这些对象之间的关系如下图:


以下为查找我们所需要字符串的实例代码


           //要匹配的文本

           string text = "One car red car blue car";


           //匹配的规则:匹配一个或多个单词为一组(小括号内为一组),

           //然后匹配一个或多个空白字符

           //最后匹配一个car字符串为一组,最后组合为规则所需。

           string pat = @"(w+)s+(car)";


           //实例化r,第二个参数为匹配的要求,这里为忽略大小写

           Regex r = new Regex(pat, RegexOptions.IgnoreCase);


           //这里还可以写成这样

           //MatchCollection mc = r.Matches(text);

           //然后用下标的形式访问每个mc,返回一个匹配的结果

           //Match m = mc[i];

           Match m = r.Match(text);

         

           int matchCount = 0;


           //此属性判断是否匹配成功

           while (m.Success)  

           {

               //匹配的个数

               Console.WriteLine("Match" + (++matchCount));


               //这里为什么要从下标1开始,因为下面获取组时:

               //下标0为一个整组,是根据匹配规则“(w+)s+(car)”获取的整组

               //下标1为第一个小括号里面的数据

               //下标2为第二个括号里面的数据....依次论推

               for (int i = 1; i <= 2; i++)

               {

                   //获取由正则表达式匹配的组的集合,这行代码相当于下面两句

                   //GroupCollection gc = mt.Groups;

                   //Group g = gc[i];

                   Group g = m.Groups[i];

                   //输出

                   Console.WriteLine("Group" + i + "='" + g + "'");


                   //获取由捕获组匹配的所有捕获的集合

                   CaptureCollection cc = g.Captures;

                   for (int j = 0; j < cc.Count; j++)

                   {

                       Capture c = cc[j];


                       System.Console.WriteLine("Capture" + j + "='" + c + "', Position=" + c.Index);

                   }

               }

               //匹配下一个

               m = m.NextMatch();

           }        


输出结果为:


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


构造函数:


这里可以根据实际需要实例化某个方法。


一个判读是否匹配的方法:


IsMatch方法:此方法的可选参数有好多,主要作用是指示所指定的正则表达式在指定的输入字符串中是否找到了匹配项。


       string[] s = {"hello world !","This is a C# language"};

       Regex rg = new Regex("ll");

       foreach (string ss in s)

       {

          Console.WriteLine("{0} 里面{1}字符串ll .",   ss,   rg.IsMatch(ss) ? "匹配到" : "没匹配到");

       }        


显示结果为:


hello world ! 里面匹配到字符串ll .

This is a C# language 里面没匹配到字符串ll .