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#裡從字串的執行個體擷取部份字串,這個方法有兩個多載的方式:
- Substring(Int32):從字串執行個體擷取部份字串。 部份字串會在指定的字元位置開始並繼續到字串的結尾。
- 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種用法
- 使用IndexOf判斷元素第一次出現的索引位置
- 使用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者都可以使用