C#基礎(chǔ)知識(shí)之字符串和正則表達(dá)式
String
System.String類專門用于存儲(chǔ)字符串,允許對(duì)字符串進(jìn)行許多操作。此外,由于這種數(shù)據(jù)類型非常重要,C# 提供了它自己的關(guān)鍵字和相關(guān)的語(yǔ)法,以便使用這個(gè)類來(lái)輕松地處理字符串。使用運(yùn)算符重載可以連接字符串:
string messagel = ''Hello"; // returns "Hello" messagel += ”,There"; // returns "Hello, There" string message2 = messagel + "!"; // returns "Hello, There! "
c#還允許使用類似于索引器的語(yǔ)法來(lái)提取指定的字符:
string message = ''Hello”; char char4 = message[4]; // returns "0"
這個(gè)類可以完成許多常見的任務(wù),如替換字符、刪除空白和把字母變成大寫形式等。
string 和 stringbuilder
String類是一個(gè)功能非常強(qiáng)大的類,它實(shí)現(xiàn)許多很有用的方法。但是,String類存在一個(gè)問(wèn)題:
重復(fù)修改給定的字符串,效率會(huì)很低,它實(shí)際上是一個(gè)不可變的數(shù)據(jù)類型,這意味著一旦對(duì)字符串對(duì)象進(jìn)行了 初始化,該字符串對(duì)象就不能改變了。
string greetingText = "Hello from all the people at Wrox Press. greetingText += **We do hope you enjoy this book as much as we enjoyed writing it.";
在執(zhí)行這段代碼時(shí),首先創(chuàng)建一個(gè)System.String類型的對(duì)象,并把它初始化為文本“Hello from all lhepeople at Wrox Press. ”,注意句號(hào)后面有一個(gè)空格。此時(shí).NET運(yùn)行庫(kù)會(huì)為該字符串分配足夠的內(nèi)存來(lái)保存這個(gè)文本(41 個(gè)字符),再設(shè)置變量greetingText來(lái)表示這個(gè)字符串實(shí)例。
從語(yǔ)法上看,下一行代碼是把更多的文本添加到字符串中。實(shí)際上并非如此,在此是創(chuàng)建一個(gè)新字符串實(shí) 例,給它分配足夠的內(nèi)存,以存儲(chǔ)合并的文本(共104個(gè)字符)。把最初的文本“Hello from all the people at Wrox Press. ” 復(fù)制到這個(gè)新字符串中,再加上額外的文本 “We do hope you enjoy this book as much as we enjoyed writing it.”。然后更新存儲(chǔ)在變量greetingText中的地址,使變量正確地指向新的字符串對(duì)象?,F(xiàn)在沒(méi)有引用舊的字符串 對(duì)象一不再有變量引用它,下一次垃圾收集器清理應(yīng)用程序中所有未使用的對(duì)象時(shí),就會(huì)刪除它。
StringBuilder類則不同,每次操作都是對(duì)自身對(duì)象進(jìn)行操作,而不是生成新的對(duì)象,其所占空間會(huì)隨著內(nèi)容的增加而擴(kuò)充,這樣,在做大量的修改操作時(shí),不會(huì)因生成大量匿名對(duì)象而影響系統(tǒng)性能。
var sb = new StringBuilder("Hello");
String是不可變類,StringBuilder是可變類。
字符串格式
$前綴
string si = "World"; string s2 = $"Hello, {s1}“;
在現(xiàn)實(shí)中,這只是語(yǔ)法糖。對(duì)于帶$前綴的字符串,編譯器創(chuàng)建String.Format方法的調(diào)用。所以前面的代碼段解讀為:
string si = "World"; string s2 = String.Format("Hello, {0}", si);
StringFormat
StringTormat方法的第一個(gè)參數(shù)接受一個(gè)格式字符串,其中的占位符從0開始編號(hào),其后是放入字符串空白處的參數(shù)。新的字符串格式要方便得多,不需要編寫那么多代碼。
不僅可以使用變量來(lái)填寫字符串的空白處,還可以使用返回一個(gè)值的任何方法:
string s2 = $”Hello, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->si. ToUpper() } '*;
這段代碼可解讀為如下類似的語(yǔ)句:
string s2 = String.Format(nHello, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->0}”,si.ToUpper ());
字符串還可以有多個(gè)空白處,如下所示的代碼:
int x = 3, y = 4; string s3 = $"MThe result of {x} + {y} is {x + y}'";
解讀為:
string s3 = String.Format("The result of {0} and {1} is {2 } ", x, y, x + y);
轉(zhuǎn)義花括號(hào)
如果希望在插值字符串中包括花括號(hào),可以使用兩個(gè)花括號(hào)轉(zhuǎn)義它們:
string s = "Hello"; Console.WriteLine($"{{s}} displays the value of s: {s}");
WriteLine方法被解讀為如下實(shí)現(xiàn)代碼:
Console.WriteLine (String.Format (*'{<!--{C}%3C!%2D%2D%20%2D%2D%3E-->s} displays the value of s: {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->0}", s));
輸出如下:
{s} displays the value of s : Hello
還可以轉(zhuǎn)義花括號(hào),從格式字符串中建立一個(gè)新的格式字符串。下面看看這個(gè)代碼段:
string formatstring = $" {s}, {{0 } } "; string s2 = "World"; WriteLine(formatstring, s2);
有了字符串變量formatstring,編譯器會(huì)把占位符0插入變量s,調(diào)用String.Format:
string formatstring = String. Format ("{0}, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->{0} } ", s);
這會(huì)生成格式字符串,其中變量s替換為值Hello,刪除第二個(gè)格式最外層的花括號(hào):
string formatstring = "Hello, {0}";
在WriteLine方法的最后一行,使用變量s2的值把World字符串插值到新的占位符0中:
WriteLine("Hello, World");
日期時(shí)間和數(shù)字的格式
除了給占位符使用字符串格式之外,還可以根據(jù)數(shù)據(jù)類型使用特定的格式。下面先從日期開始。在占位符 中,格式字符串跟在表達(dá)式的后面,用冒號(hào)隔開。下面所示的例子是用于DateTime類型的D和d格式:
var day = new DateTime(2025, 2, 14); WriteLine ($"{day:D}"); WriteLine ($"{day:d}”);
結(jié)果顯示,用大寫字母D表示長(zhǎng)日期格式字符串,用小寫字母d表示短日期字符串:
Friday, February 14, 2025 2/14/2025
應(yīng)該提到的一個(gè)問(wèn)題是,為DateTime構(gòu)建自定義的格式字符串。自定義的日期和時(shí)間格式字符串可以結(jié)合 格式說(shuō)明符,例如dd-MMM-yyyy:
Console.WriteLine($"{day:dd-MMM-yyyy}");
結(jié)果如下:
14-Feb-2025
這個(gè)自定義格式字符串利用dd把日期顯示為兩個(gè)數(shù)字(如果某個(gè)日期在10日之前,這就很重要,從這里可以看到d和dd之間的區(qū)別)、MMM(月份的縮寫名稱,注意它是大寫,而mm表示分鐘)和表示四位數(shù)年份的yyyy。
數(shù)字的格式字符串不區(qū)分大小寫。下面看看n、e、x和c標(biāo)準(zhǔn)數(shù)字格式字符串:
int i = 2477; Console.WriteLine($"{i:n} {i:e} {i:x} {i:c}H);
n格式字符串定義了一個(gè)數(shù)字格式,用組分隔符顯示整數(shù)和小數(shù)。e表示使用指數(shù)表示法,x表示轉(zhuǎn)換為十六進(jìn)制,c顯示貨幣:
2,477.00 2.477000e+003 9ad $2,477.00
對(duì)于數(shù)字的表示,還可以使用定制的格式字符串。#格式說(shuō)明符是一個(gè)數(shù)字占位符,如果數(shù)字可用,就顯示 數(shù)字;如果數(shù)字不可用,就不顯示數(shù)字。0格式說(shuō)明符是一個(gè)零占位符,顯示相應(yīng)的數(shù)字,如果數(shù)字不存在
正則表達(dá)式
正則表達(dá)式語(yǔ)言是一種專門用于字符串處理的語(yǔ)言。它包含兩個(gè)功能:
- 一組用于標(biāo)識(shí)特殊字符類型的轉(zhuǎn)義代碼。你可能很熟悉DOS命令中使用字符表示任意子字符串(例如, DOS命令DirRe會(huì)列出名稱以Re開頭的所有文件)。正則表達(dá)式使用與*類似的許多序列來(lái)表示“任 意一個(gè)字符”、“一個(gè)單詞的中斷”和個(gè)可選的字符”等。一個(gè)系統(tǒng),在搜索操作中把子字符串和中1:司結(jié)果的各個(gè)部分組合起來(lái)。
- 識(shí)別(可以是標(biāo)記或刪除)字符串中所有重復(fù)的單詞,例如,把“The computer books books”轉(zhuǎn)換為“The computer books"
const string text = "Professional C# 6 and .NET Core 1.0 provides complete coverage " + "of the latest updates, features, and capabilities, giving you " + "everything you need for C#. Get expert instruction on the latest " + "changes to Visual Studio 2015, Windows Runtime, ADO.NET, ASP.NET, " + "Windows Store Apps, Windows Workflow Foundation, and more, with " + "clear explanations, no-nonsense pacing, and valuable expert insight. " + "This incredibly useful guide serves as both tutorial and desk " + "reference, providing a professional-level review of C# architecture " + "and its application in a number of areas. You'll gain a solid " + "background in managed code and .NET constructs within the context of " + "the 2015 release, so you can get acclimated quickly and get back to work."; Console.WriteLine("Find1\n"); const string pattern = "ion"; MatchCollection matches = Regex.Matches(text, pattern, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture); WriteMatches(text, matches); Console.WriteLine();
在這段代碼中,使用了 System.Text.RegularExpressions名稱空間中Regex類的靜態(tài)方法Matches()0這個(gè)方 法的參數(shù)是一些輸入文本、一個(gè)模式和從RegexOptions枚舉中提取的一組可選標(biāo)志.
表描述了 RegexOptions枚舉的一些成員。
正則匹配主要符號(hào)規(guī)則如下:
組
在默認(rèn)情況下,把模式的一部分組合為一個(gè)組時(shí),就要求正則表達(dá)式引擎按照該組來(lái)匹配,或按照整個(gè)模式來(lái)匹配。換言之,可以把組當(dāng)成一個(gè)要匹配和返回的模式。如果要把字符 串分解為各個(gè)部分,這種模式就非常有效。
public static void NamedGroups() { Console.WriteLine("NamedGroups\n"); string line = "Hey, I've just found this amazing URI at http:// what was it --oh yes https://www.wrox.com or http://www.wrox.com:80"; string pattern = @"\b(?<protocol>https?)(?:://)(?<address>[.\w]+)([\s:](?<port>[\d]{2,4})?)\b"; Regex r = new Regex(pattern, RegexOptions.ExplicitCapture); MatchCollection mc = r.Matches(line); foreach (Match m in mc) { Console.WriteLine($"match: {m} at {m.Index}"); foreach (var groupName in r.GetGroupNames()) { Console.WriteLine($"match for {groupName}: {m.Groups[groupName].Value}"); } Console.WriteLine(); } Console.WriteLine(); }
總結(jié)
到此這篇關(guān)于C#基礎(chǔ)知識(shí)之字符串和正則表達(dá)式的文章就介紹到這了,更多相關(guān)C#字符串和正則表達(dá)式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#利用GDI+繪制旋轉(zhuǎn)文字等效果實(shí)例
這篇文章主要介紹了C#利用GDI+繪制旋轉(zhuǎn)文字等效果實(shí)例,是非常實(shí)用的重要技巧,需要的朋友可以參考下2014-09-09C#使用Jquery zTree實(shí)現(xiàn)樹狀結(jié)構(gòu)顯示 異步數(shù)據(jù)加載
這篇文章主要為大家詳細(xì)介紹了C#使用Jquery zTree實(shí)現(xiàn)樹狀結(jié)構(gòu)顯示和異步數(shù)據(jù)加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Unity實(shí)現(xiàn)物體跟隨鼠標(biāo)移動(dòng)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)物體跟隨鼠標(biāo)移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01C#使用CefSharp自定義緩存實(shí)現(xiàn)
本文介紹了如何使用C#和CefSharp自定義緩存實(shí)現(xiàn)減少Web應(yīng)用程序的網(wǎng)絡(luò)請(qǐng)求,提高應(yīng)用程序性能。首先,本文講解了CefSharp的基本知識(shí)和使用方法。然后,詳細(xì)闡述了在CefSharp中實(shí)現(xiàn)自定義緩存的步驟和技巧。最后,通過(guò)實(shí)例演示了如何使用自定義緩存功能獲取并展示網(wǎng)頁(yè)數(shù)據(jù)2023-04-04基于集合的子集與集合的全排列的相關(guān)問(wèn)題
本篇文章介紹了,集合的子集與集合的全排列的相關(guān)系列問(wèn)題說(shuō)明,需要的朋友參考下2013-05-05C#制作鷹眼的詳細(xì)全過(guò)程(帶注釋)實(shí)例代碼
C#制作鷹眼的詳細(xì)全過(guò)程(帶注釋)實(shí)例代碼,需要的朋友可以參考一下2013-03-03C#實(shí)現(xiàn)網(wǎng)絡(luò)小程序的步驟詳解
經(jīng)常要檢測(cè)某些IP地址范圍段的計(jì)算機(jī)是否在線。有很多的方法,比如進(jìn)入到網(wǎng)關(guān)的交換機(jī)上去查詢、使用現(xiàn)成的工具或者編寫一個(gè)簡(jiǎn)單的DOS腳本等等,這些都比較容易實(shí)現(xiàn)。本文將用C#來(lái)實(shí)現(xiàn),感興趣的可以了解一下2022-12-12