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


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

  一、創建字符串;

  二、正則表達式;

  首先,我先來介紹一下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 .


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM