C# Substring 定義及七種用法



年前也就是2013年苗栗三義劉德安的孫子也就是我寫了在C語言實現substr(),沒想到直到如今在Google上搜尋c#,會是排名第一的網頁,這真是始料未及的一件事,我猜C#的使用者應該會罵翻這篇文章對他沒有任何用處吧!哥寫C#工作也有三年多時間了,這回應該把我使用Substring的經驗好好分享一下才是,Substring是取得部份字串的方法,底下我們就以Microsoft Visual Studio Professional 2017, .NET Framework 4.7.2為例示範,來回答下面的問題:

  1. 從字串取得部份字串
  2. 從字串取得前面n個字元部份字串
  3. 取得部份字串從指定的 startIndex 處開始, endIndex:到指定的 endIndex處結束
  4. 取得某個字元後或前的部份字串
  5. 傳回字串第一次出現位置
  6. 取得兩字串間的部份字串
  7. 用字元分離字串再分離字串成部份字串
  8. C#對中文字串的擷取

要看更多的C#定義及用法可以在微軟官方網站上找到

1. String.Substring 方法

在C#跟.NET中,字串可以用字串型別來表示,String.Substring方法是C#裡從字串的執行個體擷取部份字串,這個方法有兩個多載的方式:

  1. Substring(Int32):從字串執行個體擷取部份字串。 部份字串會在指定的字元位置開始並繼續到字串的結尾。
  2. Substring(Int32, Int32):從字串執行個體擷取部份字串。 部份字串起始於指定的字元位置,並且具有指定的長度。

2.從字串取得前面n個字元部份字串

字串的字元是從0開始索引的,字串第一個字元的位置是從0開始的。

假設你要從字串中取得前面12個字元的部份字串,可以使用Substring方法傳遞開始的索引0跟12的長度,就可以從字串取得前面12個字元的部份字串。

程式片段:

// A long string    
string bio = "Mahesh Chand is a founder of C# Corner. Mahesh is also an author, speaker, and software architect. Mahesh founded C# Corner in 2000.";    
    
// Get first 12 characters substring from a string    
string authorName = bio.Substring(0, 12);    
Console.WriteLine(authorName);

 

現在如果要取得第12個位置後的部份字串,可以傳這個12做為開始的位置參數,看看下面的程式片段:

// Get everything else after 12th position     
string authorBio = bio.Substring(12);    
Console.WriteLine(authorBio);

 

下面是完整的程式片段:

using System;    
class Program    
{    
    static void Main(string[] args)    
    {    
        // A long string    
        string bio = "Mahesh Chand is a founder of C# Corner. Mahesh is also an author, " +    
            "speaker, and software architect. Mahesh founded C# Corner in 2000.";    
    
        // Get first 12 characters substring from a string    
        string authorName = bio.Substring(0, 12);    
        Console.WriteLine(authorName);    
    
        // Get everything else after 12th position     
        string authorBio = bio.Substring(12);    
        Console.WriteLine(authorBio);    
    
        Console.ReadKey();    
    }    
}

 

3.取得部份字串從指定的 startIndex 處開始, endIndex:到指定的 endIndex處結束

Substring方法的第一個參數是部份字串開始的索引,第二個參數是包括空白字元在內的字元數,可以使用String. Length找出字串結束的位置。

下面的範利用來找第八個位置到最後的部份字串。

// Get a string between a start index and end index    
string str = "How to find a substring in a string";    
int startIndex = 7;    
int endIndex = str.Length - 7;    
string title = str.Substring(startIndex, endIndex);    
Console.WriteLine(title);

 

你也可以透過Substring的第二參數來取得一些字元,下面的範例可以從第八個位置取得15個字元的字串。

// Get next 15 characters from starting index    
string title15 = str.Substring(startIndex, 15);

 

結果如下:

4.取得某個字元後或前的部份字串

使用Substring取得第一次出現的指定字元前的部份字串,可以透過第一個參數為0,第二個參數為指定字元的位置(長度)來做。

參考下面的程式碼:

// Get a substring after or before a character    
string authors = "Mahesh Chand, Henry He, Chris Love, Raj Beniwal, Praveen Kumar";            
string stringBeforeChar = authors.Substring(0, authors.IndexOf(","));            
Console.WriteLine(stringBeforeChar);

 

下面的程式是取得指定字元後的部份字串:

// Get a substring after a character     
string stringAfterChar = authors.Substring(authors.IndexOf(",") + 2);    
Console.WriteLine(stringAfterChar);

 

結果如下:

5.傳回字串第一次出現位置

使用String.IndexOf方法找出字串中部份字串的位置,程式範例如下:

int firstStringPosition = authors.IndexOf(“Henry”);

6.取得兩字串間的部份字串

使用Substring找出兩字串之間的部份字串,第一步要分別找出這兩個字串的位置,再來使用第一個字串的位置做第一個參數,第二個參數以第一個位置到第二個位置的長度來傳遞。

下面範例是找出‘Henry’ 跟 ‘Beniwal’之間的字串:

// Get a substring after or before a character    
string authors = "Mahesh Chand, Henry He, Chris Love, Raj Beniwal, Praveen Kumar";            
    
// Get a substring between two strings     
int firstStringPosition = authors.IndexOf("Henry");    
int secondStringPosition = authors.IndexOf("Beniwal");    
string stringBetweenTwoStrings = authors.Substring(firstStringPosition,     
    secondStringPosition - firstStringPosition + 7);    
Console.WriteLine(stringBetweenTwoStrings);

 

結果:

這個部份字串會包括‘Henry’ 跟 ‘Beniwal’這兩個字串,你可以試著增加第一個參數的位置及縮短第二個參數的值來調整。

7.用字元分離字串再分離字串成部份字串

使用 String.Split方法來分隔字串成字串陣列,你可以進一步找出字串的一個字元,再取出一個部份字串。

下面範例會使用’,’來分隔字串,之後再用”:”,來取出部份字串:

// Extract value of each attribute    
string author = "Name: Mahesh Chand, Book: C# Programming, Publisher: C# Corner, Year: 2020";    
string[] authorInfo = author.Split(‘,’);    
foreach (string info in authorInfo)    
{    
    Console.WriteLine("   {0}", info.Substring(info.IndexOf(": ") + 1));    
}

 

結果:

以上範例取自Substring in C#

8.C#對中文字串的擷取

C#對中文字串的擷取,在C#中,Substring是最常用的字串擷取函式,但是這種擷取通常一個中文字元只按一個位置計算。

以下範例引用自帶中文的字串擷取

比如:

“我是Lenmong楊”

擷取5個字元就是:

“我是Len”

但其實,我這裡想要的是:

“我是L”

在C#中有很多辦法可以做到,介紹一種最簡便的方法,利用 System.Text.Encoding.Default 的 GetBytes 函式和 GetString 函式。

private string SubStrByByte(string str, int start, int length)
{
    int len = length;
    int byteCount = System.Text.Encoding.Default.GetByteCount(str);
    //修改最大長度,防止溢位
    if (len > byteCount)
    {
        len = byteCount;
    }
    var strBytes = System.Text.Encoding.Default.GetBytes(str);
    string substr = System.Text.Encoding.Default.GetString(strBytes, start, len);
    //對於半個中文字元的特殊處理
    if (substr.EndsWith("?"))
    {
        //判斷原字串是否包含問號
        var c = str.Substring(substr.Length - 1, 1);
        if (!c.Equals("?"))
        {
            substr = substr.Substring(0, substr.Length - 1);
        }
    }
    return substr + "...";
}

 

Print Friendly, PDF & Email

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料