C# string字串詳解

2020-08-15 09:07:07

字串常用成員:

string str = Console.ReadLine();
str.Length;	//獲取字串的長度
str[0];    str[str.Length - 1];	//字串中的第一個字元和最後一個字元
str.IndexOf("@") ;		//得到的是指定字串在原字串中第一次出現的位置,
str.LastIndexOf("@");		//LastlndexOf 方法得到的是指定字串在查詢的字串中最後一次出現的位置。
str.Replace(",", "_");		//將字串中所有的‘,’替換成‘_’。
str.Insert(1, "@@@");	//將‘@@@’插入到字串的第 2 個字元的位置。

Substring(指定位置); //從字串中的指定位置開始擷取到字串結束
Substring(指定位置, 擷取的字元的個數); //從字串中的指定位置開始擷取指定字元個數的字元

擷取字串:

        string str = Console.ReadLine();
        int firstIndex = str.IndexOf("@");
        int lastIndex = str.LastIndexOf("@");
        if(firstIndex != -1 && firstIndex == lastIndex)
        {
            str = str.Substring(0, firstIndex);
        }
        Console.WriteLine("郵箱中的使用者名稱是:" + str);

數據轉換:

//隱式轉換主要是在整型、浮點型之間的轉換,將儲存範圍小的數據型別直接轉換成儲存範圍大的數據型別。
//例如將 int 型別的值轉換成 double 型別的值,將 int 型別的值轉換成 long 型別的值,或者將 float 型別的值轉換成 double 型別的值。
int a = 100;
double d = a;  //將int型別轉換爲double型別
float f = 3.14f;
d = f;    //將float型別轉換爲double型別


//強制型別轉換主要用於將儲存範圍大的數據型別轉換成儲存範圍小的,但數據型別需要相容。
//例如 int 型轉換成 float 型是可行的,但 float 型轉換成 int 型則會造成數據精度丟失,而且字串型別與整數型別之間是無法進行強制型別轉換的。
數據型別 變數名 = (數據型別)  變數名或值;
double dbl_num = 12345678910.456;
int k = (int) dbl_num ;//此處運用了強制轉換


//C# Convert方法:數據型別轉換
         float num1 = 82.26f;
         int integer;
         string str;
         integer = Convert.ToInt32(num1);
         str = Convert.ToString(num1);
         Console.WriteLine("轉換爲整型數據的值{0}", integer);
         Console.WriteLine("轉換爲字串{0},",str);

Parse 方法:

//C# Parse 方法用於將字串型別轉換成任意型別,具體的語法形式如下。
數據型別   變數 = 數據型別.Parse(字串型別的值);
int num1 = int.Parse(Console.ReadLine());

C#裝箱和拆箱(值型別和參照型別):

//C# ToString 方法用於將任意的數據型別轉換成字串型別,例如將整數型別轉換成字串型別。
int a=100;
string str=a.ToString();	//這樣整型變數 a 即可被轉換成字串型別。

//在 C# 語言中數據型別分爲值型別和參照型別,將值型別轉換爲參照型別的操作稱爲裝箱,相應地將參照型別轉換成值型別稱爲拆箱。

//在上面的轉換中 int 型別是值型別,而 string 型別是參照型別,當將值型別變數 a 的值轉換成參照型別變數 str 時就是一個裝箱的操作,
// 而拆箱操作則是將參照型別變數 str 的值再轉換成整型的過程,轉換的程式碼如下。 
a=int.Parse(str);	//這樣就完成了一個簡單的裝箱和拆箱操作。



int val = 100;
object obj = val;
Console.WriteLine("物件的值 = {0}", obj);	//這是一個裝箱的過程,是將值型別轉換爲參照型別的過程

int val = 100;
object obj = val;
int num = (int) obj;
Console.WriteLine("num: {0}", num);	//這是一個拆箱的過程,是將值型別轉換爲參照型別,再由參照型別轉換爲值型別的過程

正則表達式:

//在 Main 方法中從控制檯輸入一個郵箱,使用正則表達式判斷其正確性:

//在本例中郵箱驗證的正則表達式的寫法是包含 @,在 @ 前面是字母或者數位、下畫線,在 @ 後面也是字母或者數位、下畫線,
//並且字母後面要含有.,在 . 後面還要加上字母或者數位、下畫線。具體的程式碼如下。 
        Console.WriteLine("請輸入一個郵箱");
        string email = Console.ReadLine();
        Regex regex = new Regex(@"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$");
        if (regex.IsMatch(email))
        {
            Console.WriteLine("郵箱格式正確。");
        }
        else
        {
            Console.WriteLine("郵箱格式不正確。");
        }

編號 正則表達式 作用
1 \d{15}|\d{18} 驗證身份證號碼(15位或18位元)
2 \d{3}-\d{8}|\d{4}-\d{7} 驗證國內的固定電話(區號有3位或4位元,並在區號和電話號碼之 間加上-)
3 ^[1-9]\d*$ 驗證字串中都是正整數
4 ^-[1-9]\d*$ 驗證字串中都是負整數
5 ^-?[1-9]\d*$ 驗證字串中是整數
6 ^[A-Za-z]+$ 驗證字串中全是字母
7 A[A-Za-z0-9]+$ 驗證字串由數位和字母構成
8 [\u4e00-\u9fa5] 匹配字串中的中文
9 [^\x00-\xff] 匹配字串中的雙位元組字元(包括漢字)

C#字串及常用方法

在字串操作中常用的屬性或方法如下表所示。

編號 屬性或方法名 作用
1 Length 獲取字串的長度,即字串中字元的個數
2 IndexOf 返回整數,得到指定的字串在原字串中第一次出現的位置
3 LastlndexOf 返回整數,得到指定的字串在原字串中最後一次出現的位置
4 StartsWith 返回布爾型的值,判斷某個字串是否以指定的字串開頭
5 EndsWith 返回布爾型的值,判斷某個字串是否以指定的字串結尾
6 ToLower 返回一個新的字串,將字串中的大寫字母轉換成小寫字母
7 ToUpper 返回一個新的字串,將字串中的小寫字母轉換成大寫字母
8 Trim 返回一個新的字串,不帶任何參數時表示將原字串中前後的空格刪除。 參數爲字元陣列時表示將原字串中含有的字元陣列中的字元刪除
9 Remove 返回一個新的字串,將字串中指定位置的字串移除
10 TrimStart 返回一個新的字串,將字串中左側的空格刪除
11 TrimEnd 返回一個新的字串,將字串中右側的空格刪除
12 PadLeft 返回一個新的字串,從字串的左側填充空格達到指定的字串長度
13 PadRight 返回一個新的字串,從字串的右側填充空格達到指定的字串長度
14 Split 返回一個字串型別的陣列,根據指定的字元陣列或者字串陣列中的字元 或字串作爲條件拆分字串
15 Replace 返回一個新的字串,用於將指定字串替換給原字串中指定的字串
16 Substring 返回一個新的字串,用於擷取指定的字串
17 Insert 返回一個新的字串,將一個字串插入到另一個字串中指定索引的位置
18 Concat 返回一個新的字串,將多個字串合併成一個字串

C#數據型別轉換

C# 允許使用兩種轉換方式:隱式型別轉換和顯式型別轉換。

  1. 隱式型別轉換
    這些轉換是 C# 預設的以安全方式進行的轉換,不會導致數據丟失。例如,從小的整數型別轉換爲大的整數型別,從派生類轉換爲基礎類別。
  2. 顯式型別轉換
    顯式型別轉換,即強制型別轉換。顯式轉換需要強制轉換運算子,而且強制轉換會造成數據丟失。

常用的型別轉換方法如下表所示。

方法 描述
ToBoolean 如果可能的話,把型別轉換爲布爾型。
ToByte 把型別轉換爲位元組型別。
ToChar 如果可能的話,把型別轉換爲單個 Unicode 字元型別。
ToDateTime 把型別(整數或字串型別)轉換爲 日期-時間 結構。
ToDecimal 把浮點型或整數型別轉換爲十進制型別。
ToDouble 把型別轉換爲雙精度浮點型。
ToInt16 把型別轉換爲 16 位整數型別。
ToInt32 把型別轉換爲 32 位整數型別。
ToInt64 把型別轉換爲 64 位整數型別。
ToSbyte 把型別轉換爲有符號位元組型別。
ToSingle 把型別轉換爲小浮點數型別。
ToString 把型別轉換爲字串型別。
ToType 把型別轉換爲指定型別。
ToUInt16 把型別轉換爲 16 位無符號整數型別。
ToUInt32 把型別轉換爲 32 位無符號整數型別。
ToUInt64 把型別轉換爲 64 位無符號整數型別。

隱式數值轉換包括以下幾種:
• 從 sbyte 型別到 short,int,long,float,double,或 decimal 型別。
• 從 byte 型別到 short,ushort,int,uint,long,ulong,float,double,或 decimal 型別。
• 從 short 型別到 int,long,float,double,或 decimal 型別。
• 從 ushort 型別到 int,uint,long,ulong,float,double,或 decimal 型別。
• 從 int 型別到 long,float,double,或 decimal 型別。
• 從 uint 型別到 long,ulong,float,double,或 decimal 型別。
• 從 long 型別到 float,double,或 decimal 型別。
• 從 ulong 型別到 float,double,或 decimal 型別。
• 從 char 型別到 ushort,int,uint,long,ulong,float,double,或 decimal 型別。
• 從 float 型別到 double 型別。

其中,從 int,uint 或 long 到 float 以及從 long 到 double 的轉換可能會導致精度下降,但決不會引起數量上的丟失。其它的隱式數值轉換則不會有任何資訊丟失。
隱式數值轉換實際上就是從低精度的數值型別到高精度的數值型別的轉換。

C# Convert方法:數據型別轉換

C# Convert 方法是數據型別轉換中最靈活的方法,它能夠將任意數據型別的值轉換成任意數據型別,前提是不要超出指定數據型別的範圍。

具體的語法形式如下。

數據型別  變數名 = convert.To數據型別(變數名);

這裏 Convert.To 後面的數據型別要與等號左邊的數據型別相匹配。

Convert 類常用的型別轉換方法如下表所示。

方法 說明
Convert.ToInt16() 轉換爲整型(short)
Convert.ToInt32() 轉換爲整型(int)
Convert.ToInt64() 轉換爲整型(long)
Convert.ToChar() 轉換爲字元型(char)
Convert.ToString() 轉換爲字串型(string)
Convert.ToDateTime() 轉換爲日期型(datetime)
Convert.ToDouble() 轉換爲雙精度浮點型(double)
Conert.ToSingle() 轉換爲單精度浮點型(float)

對於整型和浮點型的強制數據型別操作也可以使用 Convert 方法代替,但是依然會損失儲存範圍大的數據型別的精度。

C#正則表達式(Regex類)

正則表達式的主要作用是驗證字串的值是否滿足一定的規則,在頁面輸入數據驗證方面的應用比較多。

例如驗證輸入的郵箱是否合法、輸入的身份證號碼是否合法、輸入的使用者名稱是否滿足條件等。

正則表達式並不是 C# 語言獨有的,在大多數的程式語言中都是支援的,包括一些指令碼語言也支援,例如 JavaScript、JQucry 等。

正則表達式是專門處理字串操作的,其本身有固定的寫法。

正則表達式的符號主要分爲元字元和表示重複的字元,分別如下表所示。

正則表達式中的元字元

編號 字元 描述
1 . 匹配除換行符以外的所有字元
2 \w 匹配字母、數位、下畫線
3 \s 匹配空白符(空格)
4 \d 匹配數位
5 \b 匹配表達式的開始或結束
6 ^ 匹配表達式的開始
7 $ 匹配表達式的結束

正則表達式中表示重複的字元

編 號 字 符 描 述
1 * 0次或多次字元
2 ? 0次或1次字元
3 + 1次或多次字元
4 {n} n次字元
5 {n,M} n到M次字元
6 {n, } n次以上字元

此外,在正則表達式中使用|分隔符表示多個正則表達式之間的或者關係,也就是在匹配某一個字串時滿足其中一個正則表達式即可。

例如使用正則表達式來驗證身份證資訊,第一代身份證是由 15 個數字構成的,第二代身份證是由 18 個數字構成的,正則表達式可以寫成 \d{15}|\d{18}

在 C# 語言中使用正則表達式時要用到 Regex 類,該類在 System.Text.RegularExpressions 名稱空間中。

在 Regex 類中使用 IsMatch 方法判斷所匹配的字串是否滿足正則表達式的要求。

【範例】在 Main 方法中從控制檯輸入一個郵箱,使用正則表達式判斷其正確性。

根據題目要求,在本例中郵箱驗證的正則表達式的寫法是包含 @,在 @ 前面是字母或者數位、下畫線,在 @ 後面也是字母或者數位、下畫線,並且字母後面要含有.,在 . 後面還要加上字母或者數位、下畫線。具體的程式碼如下。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("請輸入一個郵箱");
        string email = Console.ReadLine();
        Regex regex = new Regex(@"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$");
        if (regex.IsMatch(email))
        {
            Console.WriteLine("郵箱格式正確。");
        }
        else
        {
            Console.WriteLine("郵箱格式不正確。");
        }
    }
}

郵箱的正則表達式也有多種寫法,上面的寫法只是其中的一種,例如將範例中的\w替換成[a-zA-Z0-9_]

此外,在 Regex 類中還提供了很多方法來操作正則表達式

字元 描述
\ 跳脫字元,將一個具有特殊功能的字元跳脫爲一個普通字元,或反過來
(pattern) 匹配 pattern 並獲取這一匹配
(?:pattern) 匹配 pattern 但不獲取匹配結果
(?=pattern) 正向預查,在任何匹配 pattern 的字串開始處匹配查詢字串
(?!pattern) 負向預查,在任何不匹配 pattern 的字串開始處匹配查詢字串
x|y 匹配x或y。例如,‘z
[xyz] 字元集合。匹配所包含的任意一個字元。例如,‘[abc]’可以匹配「plain」中的‘a’
[^xyz] 負值字元集合。匹配未包含的任意字元。例如,‘[^abc]’可以匹配「plain」中的‘p’
[a-z] 匹配指定範圍內的任意字元。例如,‘[a-z]’可以匹配’a’到’z’範圍內的任意小寫字母字元
[^a-z] 匹配不在指定範圍內的任意字元。例如,‘[^a-z]’可以匹配不在‘a’~‘z’'內的任意字元
\B 匹配非單詞邊界
\D 匹配一個非數位字元,等價於 [^0-9]
\f 匹配一個換頁符
\n 匹配一個換行符
\r 匹配一個回車符
\S 匹配任何非空白字元
\t 匹配一個製表符
\v 匹配一個垂直製表符。等價於 \x0b 和 \cK
\W 匹配任何非單詞字元。等價於‘[^A-Za-z0-9_]’

除了郵箱的正則表達式以外,還有一些常用的正則表達式,如下表所示。

編號 正則表達式 作用
1 \d{15}|\d{18} 驗證身份證號碼(15位或18位元)
2 \d{3}-\d{8}|\d{4}-\d{7} 驗證國內的固定電話(區號有3位或4位元,並在區號和電話號碼之 間加上-)
3 ^[1-9]\d*$ 驗證字串中都是正整數
4 ^-[1-9]\d*$ 驗證字串中都是負整數
5 ^-?[1-9]\d*$ 驗證字串中是整數
6 ^[A-Za-z]+$ 驗證字串中全是字母
7 A[A-Za-z0-9]+$ 驗證字串由數位和字母構成
8 [\u4e00-\u9fa5] 匹配字串中的中文
9 [^\x00-\xff] 匹配字串中的雙位元組字元(包括漢字)