C#語言之字符串和正則表達式

TrishaA56 8年前發布 | 33K 次閱讀 正則表達式 C# .NET開發

來自: http://www.cnblogs.com/liter7/p/5175012.html

本文將完成以下兩個目標:

一、創建字符串;

二、正則表達式;

首先,我先來介紹一下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();
        }        </pre> 

輸出結果為:

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 .

 本文由用戶 TrishaA56 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!