網站首頁 編程語言 正文
String
System.String類專門用于存儲字符串,允許對字符串進行許多操作。此外,由于這種數據類型非常重要,C# 提供了它自己的關鍵字和相關的語法,以便使用這個類來輕松地處理字符串。使用運算符重載可以連接字符串:
string messagel = ''Hello"; // returns "Hello"
messagel += ”,There"; // returns "Hello, There"
string message2 = messagel + "!"; // returns "Hello, There! "
c#還允許使用類似于索引器的語法來提取指定的字符:
string message = ''Hello”;
char char4 = message[4]; // returns "0"
這個類可以完成許多常見的任務,如替換字符、刪除空白和把字母變成大寫形式等。
string 和 stringbuilder
String類是一個功能非常強大的類,它實現許多很有用的方法。但是,String類存在一個問題:
重復修改給定的字符串,效率會很低,它實際上是一個不可變的數據類型,這意味著一旦對字符串對象進行了 初始化,該字符串對象就不能改變了。
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.";
在執行這段代碼時,首先創建一個System.String類型的對象,并把它初始化為文本“Hello from all lhepeople at Wrox Press. ”,注意句號后面有一個空格。此時.NET運行庫會為該字符串分配足夠的內存來保存這個文本(41 個字符),再設置變量greetingText來表示這個字符串實例。
從語法上看,下一行代碼是把更多的文本添加到字符串中。實際上并非如此,在此是創建一個新字符串實 例,給它分配足夠的內存,以存儲合并的文本(共104個字符)。把最初的文本“Hello from all the people at Wrox Press. ” 復制到這個新字符串中,再加上額外的文本 “We do hope you enjoy this book as much as we enjoyed writing it.”。然后更新存儲在變量greetingText中的地址,使變量正確地指向新的字符串對象。現在沒有引用舊的字符串 對象一不再有變量引用它,下一次垃圾收集器清理應用程序中所有未使用的對象時,就會刪除它。
StringBuilder類則不同,每次操作都是對自身對象進行操作,而不是生成新的對象,其所占空間會隨著內容的增加而擴充,這樣,在做大量的修改操作時,不會因生成大量匿名對象而影響系統性能。
var sb = new StringBuilder("Hello");
String是不可變類,StringBuilder是可變類。
字符串格式
$前綴
string si = "World";
string s2 = $"Hello, {s1}“;
在現實中,這只是語法糖。對于帶$前綴的字符串,編譯器創建String.Format方法的調用。所以前面的代碼段解讀為:
string si = "World";
string s2 = String.Format("Hello, {0}", si);
StringFormat
StringTormat方法的第一個參數接受一個格式字符串,其中的占位符從0開始編號,其后是放入字符串空白處的參數。新的字符串格式要方便得多,不需要編寫那么多代碼。
不僅可以使用變量來填寫字符串的空白處,還可以使用返回一個值的任何方法:
string s2 = $”Hello, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->si. ToUpper() } '*;
這段代碼可解讀為如下類似的語句:
string s2 = String.Format(nHello, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->0}”,si.ToUpper ());
字符串還可以有多個空白處,如下所示的代碼:
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);
轉義花括號
如果希望在插值字符串中包括花括號,可以使用兩個花括號轉義它們:
string s = "Hello";
Console.WriteLine($"{{s}} displays the value of s: {s}");
WriteLine方法被解讀為如下實現代碼:
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
還可以轉義花括號,從格式字符串中建立一個新的格式字符串。下面看看這個代碼段:
string formatstring = $" {s}, {{0 } } ";
string s2 = "World";
WriteLine(formatstring, s2);
有了字符串變量formatstring,編譯器會把占位符0插入變量s,調用String.Format:
string formatstring = String. Format ("{0}, {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->{0} } ", s);
這會生成格式字符串,其中變量s替換為值Hello,刪除第二個格式最外層的花括號:
string formatstring = "Hello, {0}";
在WriteLine方法的最后一行,使用變量s2的值把World字符串插值到新的占位符0中:
WriteLine("Hello, World");
日期時間和數字的格式
除了給占位符使用字符串格式之外,還可以根據數據類型使用特定的格式。下面先從日期開始。在占位符 中,格式字符串跟在表達式的后面,用冒號隔開。下面所示的例子是用于DateTime類型的D和d格式:
var day = new DateTime(2025, 2, 14);
WriteLine ($"{day:D}");
WriteLine ($"{day:d}”);
結果顯示,用大寫字母D表示長日期格式字符串,用小寫字母d表示短日期字符串:
Friday, February 14, 2025
2/14/2025
應該提到的一個問題是,為DateTime構建自定義的格式字符串。自定義的日期和時間格式字符串可以結合 格式說明符,例如dd-MMM-yyyy:
Console.WriteLine($"{day:dd-MMM-yyyy}");
結果如下:
14-Feb-2025
這個自定義格式字符串利用dd把日期顯示為兩個數字(如果某個日期在10日之前,這就很重要,從這里可以看到d和dd之間的區別)、MMM(月份的縮寫名稱,注意它是大寫,而mm表示分鐘)和表示四位數年份的yyyy。
數字的格式字符串不區分大小寫。下面看看n、e、x和c標準數字格式字符串:
int i = 2477;
Console.WriteLine($"{i:n} {i:e} {i:x} {i:c}H);
n格式字符串定義了一個數字格式,用組分隔符顯示整數和小數。e表示使用指數表示法,x表示轉換為十六進制,c顯示貨幣:
2,477.00 2.477000e+003 9ad $2,477.00
對于數字的表示,還可以使用定制的格式字符串。#格式說明符是一個數字占位符,如果數字可用,就顯示 數字;如果數字不可用,就不顯示數字。0格式說明符是一個零占位符,顯示相應的數字,如果數字不存在
正則表達式
正則表達式語言是一種專門用于字符串處理的語言。它包含兩個功能:
- 一組用于標識特殊字符類型的轉義代碼。你可能很熟悉DOS命令中使用字符表示任意子字符串(例如, DOS命令DirRe會列出名稱以Re開頭的所有文件)。正則表達式使用與*類似的許多序列來表示“任 意一個字符”、“一個單詞的中斷”和個可選的字符”等。一個系統,在搜索操作中把子字符串和中1:司結果的各個部分組合起來。
- 識別(可以是標記或刪除)字符串中所有重復的單詞,例如,把“The computer books books”轉換為“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類的靜態方法Matches()0這個方 法的參數是一些輸入文本、一個模式和從RegexOptions枚舉中提取的一組可選標志.
表描述了 RegexOptions枚舉的一些成員。
正則匹配主要符號規則如下:
組
在默認情況下,把模式的一部分組合為一個組時,就要求正則表達式引擎按照該組來匹配,或按照整個模式來匹配。換言之,可以把組當成一個要匹配和返回的模式。如果要把字符 串分解為各個部分,這種模式就非常有效。
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();
}
總結
原文鏈接:https://blog.csdn.net/huan13479195089/article/details/126992218
相關推薦
- 2022-04-22 頁面跳轉之后后退回來頁面隱藏問題。
- 2022-06-27 C#調用打印機實現打印_C#教程
- 2023-10-11 MyBatis-plus wrapper.and用法 | apply
- 2022-09-20 Springboot整合Redis與數據持久化_Redis
- 2023-04-03 Python數據結構隊列解決約瑟夫斯問題_python
- 2024-02-25 layer.open加上時間
- 2022-08-12 如何實現在pycharm中將.ui文件轉化為.py文件_python
- 2022-11-06 Matplotlib學習筆記之plt.xticks()用法_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支