前言
你有沒有過這樣的經歷:
“這個日志文件太亂了,怎么提取錯誤信息?”
“用戶輸入的金額格式五花八門,怎么統(tǒng)一?”
“這段 HTML 里全是標簽,怎么只留文字?”
于是你開始寫 Split
、Substring
、Trim
、Replace
……寫了一堆代碼,結果還容易出錯、難維護。
兄弟,停一下!
你不是在寫代碼,你是在“手工搓面團”??!
其實,C# 早就給你準備了一把瑞士軍刀——System.Text.RegularExpressions
(正則表達式)。它不僅能幫你從“字符串泥潭”中解脫,還能讓代碼更簡潔、邏輯更清晰,甚至性能更優(yōu)!
今天我就把自己在項目中實際使用的9個正則技巧分享給大家,保證讓你直呼:"原來還能這樣用!"
1. 智能日志解析
下面這段代碼可以參考從混亂的日志中提取時間、級別、消息等關鍵信息。
適合用在日志分析、監(jiān)控系統(tǒng)、錯誤追蹤等場景
// 從海量日志中快速定位錯誤信息
string log = "2024-01-15 14:22:33 [ERROR] Database connection failed";
// 使用命名分組(?<name>pattern)提高可讀性
var match = Regex.Match(log,
@"(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[ERROR\] (?<message>.+)");
if (match.Success)
{
Console.WriteLine($"錯誤時間: {match.Groups["time"].Value}");
Console.WriteLine($"錯誤信息: {match.Groups["message"].Value}");
}
// 輸出:
// 錯誤時間: 2024-01-15 14:22:33
// 錯誤信息: Database connection failed
2. SQL防注入安全檢測
檢測潛在的SQL注入攻擊,比參數化查詢更早攔截危險輸入,可以說是不折不扣的防注入神器
//
bool IsSqlInjectionSafe(string input)
{
// 匹配常見SQL注入特征:關鍵字、注釋、特殊符號
return !Regex.IsMatch(input,
@"(\b(SELECT|INSERT|DELETE|UPDATE|DROP|EXEC)\b|--|;|/\*|\*/)");
}
// 使用示例
Console.WriteLine(IsSqlInjectionSafe("admin' OR '1'='1")); // false
Console.WriteLine(IsSqlInjectionSafe("張三")); // true
3. 富文本內容提取
從 HTML 中提取純文本內容,適合用在生成摘要、內容預覽、數據清洗等場景
// HTML內容
string html = "<div><h1>標題</h1><p>正文內容<span style='color:red'>帶樣式</span></p></div>";
// 簡單粗暴但有效的去標簽方法
string plainText = Regex.Replace(html, "<[^>]*>", "");
Console.WriteLine(plainText); // 輸出: 標題正文內容帶樣式
// 去除多余空白字符
string cleanText = Regex.Replace(plainText, @"\s+", " ").Trim();
4. 智能金額格式化
統(tǒng)一金額顯示格式,將數字格式化為帶千分位的金額(如 1,234,567.89),支持多種輸入格式。
適合財務系統(tǒng)、報表展示、金額輸入框等場景
string FormatMoney(string input)
{
// 先去除可能存在的原有分隔符
string cleanInput = Regex.Replace(input, @"[,,]", "");
// 添加千分位分隔符(從右往左每3位加一個逗號)
return Regex.Replace(cleanInput, @"(\d)(?=(\d{3})+(\.|$))", "$1,");
}
// 各種格式使用
Console.WriteLine(FormatMoney("1234567.89")); // 1,234,567.89
Console.WriteLine(FormatMoney("1234567")); // 1,234,567
Console.WriteLine(FormatMoney("1234,567.89")); // 1,234,567.89
5. 版本號智能比較
比較兩個版本號(如 1.2.3 vs 1.2.4),判斷是否需要更新。
適合用在自動更新檢查、依賴版本管理等場景
bool IsNewVersion(string current, string latest)
{
// 使用正則分組直接提取主版本、次版本、修訂號
var currentMatch = Regex.Match(current, @"(\d+)\.(\d+)\.(\d+)");
var latestMatch = Regex.Match(latest, @"(\d+)\.(\d+)\.(\d+)");
// 逐級比較版本號
for (int i = 1; i <= 3; i++)
{
int currentPart = int.Parse(currentMatch.Groups[i].Value);
int latestPart = int.Parse(latestMatch.Groups[i].Value);
if (latestPart > currentPart) returntrue;
if (latestPart < currentPart) returnfalse;
}
returnfalse; // 版本號完全相同
}
Console.WriteLine(IsNewVersion("1.2.3", "1.2.4")); // true
Console.WriteLine(IsNewVersion("2.0.0", "1.9.9")); // false
6. 密碼強度驗證
驗證密碼是否符合安全策略(大小寫、數字、特殊字符、長度)。
bool IsStrongPassword(string password)
{
// 使用正向預查(?=)確保包含各種字符類型
// 至少8位,包含大小寫字母、數字、特殊字符
return Regex.IsMatch(password,
@"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{8,}$");
}
// 測試用例
Console.WriteLine(IsStrongPassword("Weak123")); // false - 缺少特殊字符
Console.WriteLine(IsStrongPassword("Strong@123")); // true - 符合要求
Console.WriteLine(IsStrongPassword("短")); // false - 長度不足
7. 中文姓名驗證
驗證中文姓名格式,支持 ·
連接的少數民族姓名。
適合用在用戶注冊、實名認證、數據校驗等場景
bool IsValidChineseName(string name)
{
// 支持常規(guī)中文姓名和少數民族姓名中的間隔號·
// 長度2-10個字符,避免極端情況
return Regex.IsMatch(name, @"^[\u4e00-\u9fa5·]{2,10}$");
}
// 各種姓名格式驗證
Console.WriteLine(IsValidChineseName("張三")); // true
Console.WriteLine(IsValidChineseName("歐陽建國")); // true
Console.WriteLine(IsValidChineseName("阿依古麗·買買提")); // true
Console.WriteLine(IsValidChineseName("John")); // false
8. 智能空格清理
清理多余空格,保留合理間距,保持數據整潔。
適合用在表單輸入凈化、文本預處理、數據清洗等場景
string CleanWhitespace(string input)
{
// 第一步:將多個連續(xù)空格替換為單個空格
string step1 = Regex.Replace(input, @"\s+", " ");
// 第二步:清理括號周圍的空格
string step2 = Regex.Replace(step1, @"\s?\(\s?", "(");
string step3 = Regex.Replace(step2, @"\s?\)\s?", ")");
return step3.Trim();
}
string messyText = "你好 世界 ! 這是一段 ( 測試文本 ) ";
Console.WriteLine(CleanWhitespace(messyText));
// 輸出: "你好 世界 ! 這是一段 (測試文本)"
9. 批量重命名文件
自動化整理照片或文檔文件,適合文件管理、自動化腳本、數據整理等場景
void RenameFiles(string pattern, string replacement)
{
foreach (var filePath in Directory.GetFiles("."))
{
string fileName = Path.GetFileName(filePath);
string newName = Regex.Replace(fileName, pattern, replacement);
if (fileName != newName)
{
string newPath = Path.Combine(Path.GetDirectoryName(filePath), newName);
File.Move(filePath, newPath);
Console.WriteLine($"重命名: {fileName} -> {newName}");
}
}
}
// 示例:將"IMG_20240115_123456.jpg"改為"2024-01-15.jpg"
RenameFiles(@"IMG_(\d{4})(\d{2})(\d{2})_\d+\.jpg", "$1-$2-$3.jpg");
總結
看完這9個真實案例,是不是對正則表達式刮目相看了?
其實正則表達式的魅力遠不止于此——它就像編程界的"超能力",一旦掌握就能在很多場景下大幅提升開發(fā)效率。
正則表達式不是萬能的,但在處理文本模式匹配時,它絕對是你的最佳伙伴。
現(xiàn)在就在你的項目里試試這些技巧吧,相信你會愛上這種"一行代碼搞定復雜問題"的爽快感!
閱讀原文:原文鏈接
該文章在 2025/9/2 10:57:46 編輯過