C# Substring 七種用法與關鍵字認法

前言

因我們可由COM PORT接收到MCU資訊,但其資料是一串字串並未分隔。
EX: 由MCU輸出”System restart \n\r” +”MCU restart ok\r\n”=>這邊C# UI接收到的會是”System restart \n\rMCU restart ok\r\n”不會切割成2句文字
因此本章節會介紹如何做字串切割如下清單與確認關鍵字,方便資料讀取

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

定義

命名空間:System組件:mscorlib.dll, netstandard.dll

從這個執行個體擷取子字串。

這個成員是多載的。 如需這個成員的完整資訊,包含語法、使用方式和範例,請按一下多載清單中的名稱。

程式範例

C# String.Substring 方法

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

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

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

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

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

using System;    
class Program    
{    
    static void Main(string[] args)    
    {    
        // A long string    
        string bio = "Mahesh Chand is a founder of <a href="https://job.achi.idv.tw/tag/c/" class="st_tag internal_tag " rel="tag" title="Posts tagged with C#">C#</a> Corner. Mahesh is also an author, " +    
            "speaker, and software architect. Mahesh founded C# Corner in 2000.";    
    
        // Get first 12 characters substring from a string    
        <strong><mark style="background-color:rgba(0, 0, 0, 0);color:#f00808" class="has-inline-color">string authorName = bio.Substring(0, 12);</mark></strong>    
        Console.WriteLine(authorName);    
    
        // Get everything else after 12th position     
        string authorBio = bio.Substring(12);    
        Console.WriteLine(authorBio);    
    
        Console.ReadKey();    
    }    
}

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

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

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

// Get a string between a start index and end index    
string str = "How to <a href="https://job.achi.idv.tw/tag/find/" class="st_tag internal_tag " rel="tag" title="Posts tagged with find">find</a> a substring in a string";    
int startIndex = 7;    
int endIndex = str.Length - 7;    
<strong><mark style="background-color:rgba(0, 0, 0, 0);color:#ed0d0d" class="has-inline-color">string title = str.Substring(startIndex, endIndex);    </mark></strong>
Console.WriteLine(title);

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

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

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

使用Substring取得第一次出現的指定字元前的部份字串,可以透過第一個參數為0,第二個參數為指定字元的位置(長度)來做。
PS:此用法為UI中切割出資料主要用法

string authors = "Mahesh Chand, Henry He, Chris Love, Raj Beniwal, Praveen Kumar";            
string stringBeforeChar = authors.Substring(0, authors.IndexOf(","));            
Console.WriteLine(stringBeforeChar);

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

string stringAfterChar = authors.Substring(authors.IndexOf(",") + 2);    
Console.WriteLine(stringAfterChar);

PS: authors.IndexOf(“,”)其中傳回字串”,”第一次出現位置

取得兩字串間的部份字串

使用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);

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

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

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

/ Extract value of each attribute    
string author = "Name: Mahesh Chand, Book: <a href="https://job.achi.idv.tw/tag/c/" class="st_tag internal_tag " rel="tag" title="Posts tagged with C#">C#</a> Programming, Publisher: C# Corner, Year: 2020";    
string[] authorInfo = author.Split(‘,’);    
foreach (string info in authorInfo)    
{    
    Console.WriteLine("   {0}", info.Substring(info.IndexOf(": ") + 1));    
}

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("?"))
    {
        //判斷原字串是否包含問號
        <strong><mark style="background-color:rgba(0, 0, 0, 0);color:#f90707" class="has-inline-color">var c = str.Substring(substr.Length - 1, 1);</mark></strong>
        if (!c.Equals("?"))
        {
            substr = substr.Substring(0, substr.Length - 1);
        }
    }
    return substr + "...";
}

PS:這邊留意String.Length 

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

C# 字串中如何尋找元素?

這邊提供2種用法

  1. 使用IndexOf判斷元素第一次出現的索引位置
  2. 使用contains()方法,判斷元素是否包含特定值
List<int> list2 = new List<int>() { 5, 7, 3, 10,17, 15, 18, 20, 13, 2,12 };

var index=  list2.IndexOf(17);

使用Indexof是去搜尋在此字串中含有所限定字元的位置資訊如上所示這邊會show index=4,在判別方面可以用
if(index>0)來判斷是否含有所需求元素

 bool ct = mReplyString.Contains("Presence");

mReplyString.Contains這邊的Contains是去判斷元素是否在字串裡面回傳的是bool函數 2者都可以使用

Leave a Comment

Your email address will not be published. Required fields are marked *

Shopping Cart