C# Substring 定義及七種用法

年前也就是2013年苗栗三義劉德安的孫子也就是我寫了在C語言實現substr(),沒想到直到如今在Google上搜尋c#substring,會是排名第一的網頁,這真是始料未及的一件事,我猜C#的使用者應該會罵翻這篇文章對他沒有任何用處吧!哥寫C#工作也有三年多時間了,這回應該把我使用C# string 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. C# 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方法找出字串中部份字串的位置,這是c# 搜尋字串常用的方法,程式範例如下:

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 + "...";
}

這種中文字串的長度使用(String.Length 屬性)及擷取似乎騙過很多人,我的同事在做考績表的表單程式時,也誤判了這個長度,導致使用者一致輸入錯誤的長度,跟SQL儲存欄位有牽扯時,更容易被搞混。在微軟的String.Length 屬性網頁中,有特別備註說明,列舉於下給各位參考:

備註

Length屬性 Char 會傳回這個實例中的物件數目,而不是 Unicode 字元數。 原因是 Unicode 字元可能會以一個以上的字元表示 Char 。 使用 System.Globalization.StringInfo 類別來處理每個 Unicode 字元,而不是每個字元 Char 。

在某些語言中,例如 C 和 c + +,null 字元表示字串的結尾。 在 .NET 中,null 字元可以內嵌在字串中。 當字串包含一或多個 null 字元時,它們會包含在總字串的長度中。 例如,在下列字串中,子字串 “abc” 和 “def” 會以 null 字元分隔。 Length屬性會傳回7,表示它包含六個字母字元以及 null 字元。

string characters = "abcu0000def"; 
Console.WriteLine(characters.Length); // Displays 7

※2022/04/08 後記 c# contains用法

可以參考最近翻譯的c# contains用法及程式碼範例

大叔最新分享C# List 定義及七種常用方法,這篇C#教學裡文章裡的contains可以幫你處理c# string find substring的問題,有需要可以點擊查詢閱讀,如果有建議想要問的,可以直接留言給我!

在SQL中也有SUBSTRING函數可以使用,語法如下:

SUBSTRING ( expression ,start , length )

範例:在MySQL BLOB和TEXT型態這篇文章裡有SUBSTRING的範例可以參考。

※2022/05/10

如果你對這篇c# 教學分享沒有獲得收益,歡迎留言分享讓我們改善,或是繼續看《【C#】3小時初學者教學 |Csharp | C# 教學 | C# 入門 | C++++》這部Youtube影片,看能不能有所幫助。

將您的網站交給世界第一的虛擬主機服務。

你現在應該想要架個Windows 虛擬主機,實現絕妙創業構想。立即取得建站神器+行銷,我們將加碼隨附免費網域和 Email。

當然也可以使用免費的Google Sites來架站賺錢,可參閱用G Suite協作平台Google Sites打造專業的賺錢網站在家工作

學 C# 敢找機電整合工程師的工作嗎?

把C#學習列入checklist範本工具使用

C# List 定義及七種常用方法
深入淺出物件導向分析與設計
在C語言實現substr()

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

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