C# 字符串處理實(shí)戰(zhàn)指南(從基礎(chǔ)方法到高級技巧)
在 C# 編程中,字符串處理是日常開發(fā)中不可或缺的一部分。無論是處理用戶輸入、文件讀取,還是與外部系統(tǒng)交互,都離不開對字符串的各種操作。本文將全面介紹 C# 中豐富的字符串處理方法,結(jié)合代碼示例,幫助你深入理解并掌握這些實(shí)用技巧。
基礎(chǔ)方法
1. 字符串長度獲取 -Length屬性
Length 屬性用于獲取字符串中字符的個(gè)數(shù),且不包括末尾的空字符。這是一個(gè)非?;A(chǔ)且常用的屬性,在很多場景下都能發(fā)揮重要作用。
string str = "Hello"; Console.WriteLine(str.Length); // 輸出 5
2. 大小寫轉(zhuǎn)換 -ToLower()和ToUpper()
在處理字符串時(shí),有時(shí)需要將字符串統(tǒng)一轉(zhuǎn)換為大寫或小寫形式,以方便進(jìn)行比較或其他操作。ToLower() 方法將字符串轉(zhuǎn)換為小寫形式,ToUpper() 方法則將其轉(zhuǎn)換為大寫形式。
string str = "Hello"; Console.WriteLine(str.ToLower()); // 輸出 "hello" Console.WriteLine(str.ToUpper()); // 輸出 "HELLO"
3. 子字符串截取 -Substring(int startIndex, int length)
當(dāng)需要從一個(gè)較長的字符串中提取特定部分時(shí),Substring 方法就派上用場了。它允許你從指定的索引開始,截取指定長度的子字符串。
string str = "Hello World"; Console.WriteLine(str.Substring(6, 5)); // 輸出 "World"
4. 字符移除 -Remove(int startIndex, int length)
Remove 方法用于從指定索引開始移除指定長度的字符。這在需要對字符串進(jìn)行清理或修改時(shí)非常有用。
string str = "Hello World"; Console.WriteLine(str.Remove(6, 5)); // 輸出 "Hello "
另外,Remove(int startIndex) 方法可以從指定索引開始移除字符串的剩余部分。
string str = "Hello World"; Console.WriteLine(str.Remove(6)); // 輸出 "Hello "
5. 字符串替換 -Replace(string oldValue, string newValue)
Replace 方法可以將字符串中的指定字符或子字符串替換為新的內(nèi)容。這在處理文本替換、數(shù)據(jù)清洗等場景中經(jīng)常使用。
string str = "Hello World";
Console.WriteLine(str.Replace('o', '0')); // 輸出 "Hell0 W0rld"
Console.WriteLine(str.Replace("World", "C#")); // 輸出 "Hello C#"6. 字符串拆分 -Split(char[] separator, StringSplitOptions options)
Split 方法根據(jù)指定的分隔符將字符串拆分成多個(gè)子字符串,并返回一個(gè)字符串?dāng)?shù)組。StringSplitOptions 枚舉可以控制是否移除空元素。
string str = "Hello,World,C#";
string[] parts = str.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string part in parts)
{
Console.WriteLine(part); // 輸出 "Hello" "World" "C#"
}7. 字符或子字符串查找 -IndexOf和LastIndexOf
IndexOf 方法用于查找指定字符或子字符串在字符串中第一次出現(xiàn)的位置,而 LastIndexOf 方法則查找其最后一次出現(xiàn)的位置。如果未找到,這兩個(gè)方法都會返回 -1。
string str = "Hello World";
Console.WriteLine(str.IndexOf('W')); // 輸出 6
Console.WriteLine(str.IndexOf("World")); // 輸出 6
string str2 = "abc abc abc";
Console.WriteLine(str2.LastIndexOf('a')); // 輸出 9(最后一個(gè) 'a' 的位置)
Console.WriteLine(str2.LastIndexOf("abc")); // 輸出 9(最后一個(gè) "abc" 的位置)8. 空白字符移除 -Trim()、TrimStart()和TrimEnd()
在處理用戶輸入或讀取文件時(shí),字符串的開頭或結(jié)尾可能會包含空白字符(如空格、制表符和換行符)。Trim 方法可以移除字符串兩端的空白字符,TrimStart 方法移除開頭的空白字符,TrimEnd 方法移除結(jié)尾的空白字符。
string str = " Hello World "; Console.WriteLine(str.Trim()); // 輸出 "Hello World" Console.WriteLine(str.TrimStart()); // 輸出 "Hello World " Console.WriteLine(str.TrimEnd()); // 輸出 " Hello World"
9. 子字符串包含判斷 -Contains(string value)
Contains 方法用于判斷字符串是否包含指定的子字符串。如果包含,返回 true;否則返回 false。
string str = "Hello World";
Console.WriteLine(str.Contains("World")); // 輸出 True10. 字符串開頭和結(jié)尾判斷 -StartsWith(string value)和EndsWith(string value)
StartsWith 方法判斷字符串是否以指定的子字符串開始,EndsWith 方法判斷字符串是否以指定的子字符串結(jié)束。這在驗(yàn)證文件擴(kuò)展名、URL 前綴等場景中非常有用。
string str = "Hello World";
Console.WriteLine(str.StartsWith("Hello")); // 輸出 True
Console.WriteLine(str.EndsWith("World")); // 輸出 True11. 字符串填充 -PadLeft(int totalWidth, char paddingChar)和PadRight(int totalWidth, char paddingChar)
PadLeft 和 PadRight 方法可以在字符串的左側(cè)或右側(cè)填充指定的字符,直到達(dá)到指定的總寬度。這在格式化輸出、生成固定長度的字符串等場景中很實(shí)用。
string str = "123"; Console.WriteLine(str.PadLeft(5, '*')); // 輸出 "**123"(左側(cè)填充2個(gè)'*') Console.WriteLine(str.PadRight(5, '*')); // 輸出 "123**"(右側(cè)填充2個(gè)'*')
12. 字符串連接 -Join(string separator, params string[] values)和Concat(params string[] values)
Join 方法將多個(gè)字符串連接成一個(gè)字符串,并使用指定的分隔符分隔它們;Concat 方法則直接將多個(gè)字符串連接起來。
string[] words = { "Hello", "World", "C#" };
string sentence = string.Join(", ", words);
Console.WriteLine(sentence); // 輸出 "Hello, World, C#"
string result = string.Concat("Hello", " ", "World");
Console.WriteLine(result); // 輸出 "Hello World"13. 字符串格式化 -Format(string format, params object[] args)和字符串插值
Format 方法可以將指定的參數(shù)插入到格式字符串中,實(shí)現(xiàn)字符串的格式化。從 C# 6.0 開始,還引入了字符串插值的語法,使用 $ 符號和大括號 {} 來嵌入變量或表達(dá)式,使代碼更加簡潔易讀。
string name = "John";
int age = 30;
string formattedString = string.Format("Name: {0}, Age: {1}", name, age);
Console.WriteLine(formattedString); // 輸出 "Name: John, Age: 30"
int age2 = 30;
string name2 = "Alice";
string message = $"My name is {name2} and I am {age2} years old.";
Console.WriteLine(message); // 輸出 "My name is Alice and I am 30 years old."14. 空字符串判斷 -IsNullOrEmpty(string value)和IsNullOrWhiteSpace(string value)
IsNullOrEmpty 方法用于判斷字符串是否為空或 null,IsNullOrWhiteSpace 方法則判斷字符串是否為空、null 或僅包含空白字符。在處理用戶輸入時(shí),這兩個(gè)方法可以幫助我們進(jìn)行有效的驗(yàn)證。
string str1 = null; Console.WriteLine(string.IsNullOrEmpty(str1)); // 輸出 True string str2 = " "; Console.WriteLine(string.IsNullOrWhiteSpace(str2)); // 輸出 True
15. 字符復(fù)制 -CopyTo(int sourceIndex, char[] destination, int destinationIndex, int count)
CopyTo 方法將字符串中的字符復(fù)制到指定的字符數(shù)組中。需要注意的是,超出字符串長度的部分不會被復(fù)制,保持默認(rèn)值。
char[] charArray = new char[5]; string str = "Hello"; str.CopyTo(0, charArray, 0, 5); Console.WriteLine(new string(charArray)); // 輸出 "Hello"
16. 字符數(shù)組查找 -IndexOfAny(char[] anyOf)和LastIndexOfAny(char[] anyOf
IndexOfAny 方法查找字符數(shù)組中字符在字符串中第一次出現(xiàn)的位置,LastIndexOfAny 方法查找其最后一次出現(xiàn)的位置。
string str = "Hello World";
char[] chars = { 'o', 'W' };
Console.WriteLine(str.IndexOfAny(chars)); // 輸出 4('o'的位置)
Console.WriteLine(str.LastIndexOfAny(chars)); // 輸出 6('W'的位置)17. 字符串插入 -Insert(int startIndex, string value)
Insert 方法可以在指定索引處插入一個(gè)字符串,實(shí)現(xiàn)對字符串的動態(tài)修改。
string str = "Hello"; Console.WriteLine(str.Insert(5, " World")); // 輸出 "Hello World"
高級特性深度解析
1. 正則表達(dá)式 - Regex 類
// 驗(yàn)證郵箱格式
bool IsValidEmail(string email) =>
Regex.IsMatch(email, @"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
// 替換所有數(shù)字
string sanitized = Regex.Replace("abc123def456", @"\d", ""); // "abcdef"技巧:使用RegexOptions.Compiled預(yù)編譯正則表達(dá)式提升性能。
2. 字符串比較的高級選項(xiàng)
// 文化敏感比較(默認(rèn))
bool equals1 = "Müller".Equals("mueller", StringComparison.CurrentCulture);
// 二進(jìn)制比較(區(qū)分大小寫)
bool equals2 = "Müller".Equals("MüLLER", StringComparison.Ordinal);
// 不區(qū)分大小寫和重音符號
bool equals3 = "café".Equals("CAFE",
StringComparison.OrdinalIgnoreCase |
StringComparison.InvariantCultureIgnoreCase);3. 不可變性與 StringBuilder
// 低效方式:每次拼接生成新對象 string result = ""; for (int i = 0; i < 1000; i++) result += i; // 高效方式:使用StringBuilder var sb = new StringBuilder(); for (int i = 0; i < 1000; i++) sb.Append(i); string optimized = sb.ToString();
4. 字符編碼轉(zhuǎn)換
// 字符串轉(zhuǎn)字節(jié)數(shù)組
byte[] bytes = Encoding.UTF8.GetBytes("Hello");
// 字節(jié)數(shù)組轉(zhuǎn)字符串
string text = Encoding.UTF8.GetString(bytes);5. 字符串反轉(zhuǎn)
// 方法1:使用ToCharArray和Reverse
string reversed = new string("Hello".ToCharArray().Reverse().ToArray());
// 方法2:使用LINQ
string reversed2 = string.Join("", "Hello".Reverse());實(shí)用技巧
1. 安全的空值處理
// 空值合并運(yùn)算符 string username = user?.Name ?? "Guest"; // 空值條件調(diào)用 int? length = user?.Name?.Length;
2. 格式化字符串的高級用法
// 數(shù)字格式化
decimal amount = 1234.5678m;
string formatted = amount.ToString("C2"); // $1,234.57
// 日期格式化
DateTime now = DateTime.Now;
string date = now.ToString("yyyy-MM-dd HH:mm:ss");3. 字符串的內(nèi)存優(yōu)化
// 使用StringIntern防止重復(fù)字符串
string key1 = "Hello";
string key2 = string.Intern("Hello"); // 共享同一內(nèi)存地址
// 只讀內(nèi)存Span<char>
ReadOnlySpan<char> span = "Hello".AsSpan();4. 字符串分割的高級選項(xiàng)
// 按多個(gè)分隔符分割
string[] parts = "apple;banana,orange".Split(
new[] { ';', ',' },
StringSplitOptions.TrimEntries);
// 按固定長度分割
IEnumerable<string> SplitFixedLength(string input, int length)
{
for (int i = 0; i < input.Length; i += length)
yield return input.Substring(i, Math.Min(length, input.Length - i));
}性能優(yōu)化實(shí)戰(zhàn)
1. 避免重復(fù)的字符串創(chuàng)建
// 反模式:每次循環(huán)創(chuàng)建新字符串
foreach (var item in items)
message += item.ToString();
// 推薦:使用StringBuilder
var sb = new StringBuilder();
foreach (var item in items)
sb.Append(item.ToString());
message = sb.ToString();2. 緩存常用字符串
public static class Constants
{
public static readonly string Success = "Operation succeeded";
public static readonly string Error = "An error occurred";
}3. 預(yù)編譯正則表達(dá)式
private static readonly Regex EmailRegex =
new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$", RegexOptions.Compiled);完整方法速查表
| 分類 | 方法名 | 說明 |
|---|---|---|
| 基礎(chǔ)操作 | Length | 獲取字符個(gè)數(shù) |
| ToCharArray | 轉(zhuǎn)換為字符數(shù)組 | |
| 修改操作 | Substring, Insert, Remove, Replace | 子串截取、插入、刪除、替換 |
| 查找操作 | IndexOf, LastIndexOf, Contains | 查找位置、是否包含 |
| 轉(zhuǎn)換操作 | ToLower, ToUpper, Trim | 大小寫轉(zhuǎn)換、空白修剪 |
| 組合操作 | Join, Concat, Split | 字符串拼接與分割 |
| 格式化 | Format, 插值 | 字符串格式化 |
| 高級操作 | Regex, StringBuilder, Encoding | 正則表達(dá)式、高效拼接、編碼轉(zhuǎn)換 |
| 安全檢查 | IsNullOrEmpty, IsNullOrWhiteSpace | 空值與空白檢查 |
實(shí)戰(zhàn)案例:日志解析系統(tǒng)
思路總結(jié)
- 輸入驗(yàn)證:在開始解析之前,先檢查輸入的日志行是否為空或僅包含空白字符,以及分割后的部分?jǐn)?shù)量是否符合預(yù)期,避免后續(xù)處理時(shí)出現(xiàn)異常。
- 時(shí)間戳解析:使用
DateTime.ParseExact方法將日志中的時(shí)間戳按照指定的格式進(jìn)行解析,并處理可能的格式錯誤。 - 日志級別處理:將日志級別轉(zhuǎn)換為大寫,以統(tǒng)一格式。
- 消息內(nèi)容處理:將日志消息中的
\n替換為當(dāng)前環(huán)境的換行符,方便后續(xù)顯示。 - 異常處理:在解析過程中捕獲可能出現(xiàn)的異常,并拋出有意義的錯誤信息,方便調(diào)試和維護(hù)。
// 定義日志條目類,用于存儲解析后的日志信息
public class LogEntry
{
// 日志的時(shí)間戳
public DateTime Timestamp { get; set; }
// 日志的級別,如 INFO、ERROR 等
public string Level { get; set; }
// 日志的具體消息內(nèi)容
public string Message { get; set; }
}
// 日志解析器類,負(fù)責(zé)將日志字符串解析為 LogEntry 對象
public class LogParser
{
// 定義日期時(shí)間的格式,用于解析日志中的時(shí)間戳
private const string DateFormat = "yyyy-MM-dd HH:mm:ss";
// 解析日志行的方法,接收一個(gè)日志字符串作為輸入,返回解析后的 LogEntry 對象
public LogEntry Parse(string logLine)
{
// 思路:首先檢查輸入的日志行是否為空或僅包含空白字符,如果是則拋出異常,避免后續(xù)處理時(shí)出現(xiàn)錯誤
if (string.IsNullOrWhiteSpace(logLine))
{
// 拋出 ArgumentException 異常,提示輸入的日志行無效
throw new ArgumentException("輸入的日志行不能為空或僅包含空白字符。", nameof(logLine));
}
// 思路:使用 Split 方法將日志行按 '|' 字符分割成多個(gè)部分,并去除每個(gè)部分前后的空白字符
string[] parts = logLine.Split('|', StringSplitOptions.TrimEntries);
// 思路:檢查分割后的部分?jǐn)?shù)量是否符合預(yù)期,如果不符合則拋出異常,確保日志格式正確
if (parts.Length != 3)
{
// 拋出 ArgumentException 異常,提示日志行格式不正確
throw new ArgumentException("日志行格式不正確,預(yù)期包含 3 個(gè)部分,用 '|' 分隔。", nameof(logLine));
}
// 嘗試解析時(shí)間戳
DateTime timestamp;
try
{
// 思路:使用 DateTime.ParseExact 方法將分割后的第一部分按照指定的日期時(shí)間格式進(jìn)行解析
// CultureInfo.InvariantCulture 確保解析時(shí)不依賴于當(dāng)前系統(tǒng)的區(qū)域設(shè)置
timestamp = DateTime.ParseExact(parts[0], DateFormat, CultureInfo.InvariantCulture);
}
catch (FormatException)
{
// 若解析失敗,拋出 ArgumentException 異常,提示時(shí)間戳格式不正確
throw new ArgumentException($"時(shí)間戳格式不正確,預(yù)期格式為 '{DateFormat}'。", nameof(logLine));
}
// 思路:將分割后的第二部分轉(zhuǎn)換為大寫,作為日志級別
string level = parts[1].ToUpper();
// 思路:將分割后的第三部分中的 "\n" 替換為當(dāng)前環(huán)境的換行符
string message = parts[2].Replace("\\n", Environment.NewLine);
// 創(chuàng)建一個(gè)新的 LogEntry 對象,并將解析得到的時(shí)間戳、日志級別和消息內(nèi)容賦值給對應(yīng)的屬性
return new LogEntry
{
Timestamp = timestamp,
Level = level,
Message = message
};
}
}
// 以下是一個(gè)簡單的測試類,用于演示 LogParser 的使用
class Program
{
static void Main()
{
// 示例日志行
string logLine = "2024-01-01 12:00:00|INFO|這是一條日志消息\\n第二行";
// 創(chuàng)建 LogParser 實(shí)例
LogParser parser = new LogParser();
try
{
// 調(diào)用 Parse 方法解析日志行
LogEntry entry = parser.Parse(logLine);
// 輸出解析后的日志信息
Console.WriteLine($"時(shí)間戳: {entry.Timestamp}");
Console.WriteLine($"日志級別: {entry.Level}");
Console.WriteLine($"日志消息: {entry.Message}");
}
catch (ArgumentException ex)
{
// 捕獲并輸出解析過程中可能拋出的異常信息
Console.WriteLine($"解析日志時(shí)出錯: {ex.Message}");
}
}
}到此這篇關(guān)于C# 字符串處理實(shí)戰(zhàn)指南(從基礎(chǔ)方法到高級技巧)的文章就介紹到這了,更多相關(guān)c#字符串處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)的中國移動官網(wǎng)手機(jī)號碼采集器
這篇文章主要介紹了C#實(shí)現(xiàn)的中國移動官網(wǎng)手機(jī)號碼采集器,本文先是采集號碼入庫,同時(shí)給出了篩選各類靚號的SQL語句,需要的朋友可以參考下2014-10-10
使用C#的aforge類庫識別驗(yàn)證碼實(shí)例
這篇文章主要介紹了使用C#的aforge類庫識別驗(yàn)證碼實(shí)例,aforge類庫是一個(gè)非常強(qiáng)大的類庫,包括計(jì)算機(jī)視覺與人工智能、圖像處理、神經(jīng)網(wǎng)絡(luò)、遺傳算法、機(jī)器學(xué)習(xí)、機(jī)器人等領(lǐng)域,需要的朋友可以參考下2014-08-08
c#使用windows服務(wù)更新站點(diǎn)地圖的詳細(xì)示例
這篇文章主要介紹了c#使用windows服務(wù)更新站點(diǎn)地圖的詳細(xì)示例,需要的朋友可以參考下2014-04-04
C#實(shí)現(xiàn)win10 uwp 右擊浮出窗在點(diǎn)擊位置
本文主要讓MenuFlyout出現(xiàn)在我們右擊位置。我們建一個(gè)ListView,然后綁定后臺,在我們ListView要右擊顯示我們的浮出,要求我們的浮出在我們點(diǎn)擊位置2016-10-10
詳解C#中TcpClient對象的方法實(shí)現(xiàn)
TcpClient 類是用于基于 TCP 協(xié)議進(jìn)行客戶端通信的重要類,它封裝了連接、數(shù)據(jù)傳輸、異常處理等常見操作,提供了易用的 API,下面就來詳細(xì)的介紹一下如何使用2026-05-05

