首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

C# 正則表達式雙引號處理完全指南:轉義、分組、替換與編譯優化

     編輯:更多程式設計知識

C# 正則表達式中雙引號的處理、分組引用、RegexOptions 枚舉、編譯優化、替換模式等核心知識點總結,結合實戰案例演示 CSS URL 提取、SQL 批量生成等場景。

C# 字符串與正則雙引號轉義規則

在 C# 中處理包含雙引號的正則模式,有三種寫法:

方式語法示例適用場景
逐字字符串 + 雙寫@""""@"""url\(""([^""]*)""\)""最推薦,可讀性最好
普通字符串 + 轉義\"\"url\\(\"([^\"]*)\"\\)\"需要換行符等轉義字符時
原始字符串字面量@$"" (C# 11+)@$"url\(""([^""]*)""\)"現代語法,支持插值

CSS URL 提取實例


// 目標:提取 url("...") 或 url('...') 中的路徑
// 正則:url\((['"]?)(.+?)\1\)
// C# 寫法:
var reg = new Regex(@"url\((['""]?)(.+?)\1\)");
//                    ↑ 逐字字符串
//                      ↑↑ 雙寫雙引號
//                         ↑ 單引號無需轉義

string css = @"background-image:url(""//ssl.gstatic.com/ui/v1/menu/checkmark.png"");";
var match = reg.Match(css);
Console.WriteLine(match.Value); 
// 輸出:url("//ssl.gstatic.com/ui/v1/menu/checkmark.png")
Console.WriteLine(match.Groups[2].Value); 
// 輸出://ssl.gstatic.com/ui/v1/menu/checkmark.png

命名分組與反向引用


// 命名分組語法:(?...)
// 反向引用:\k(注意:C# 用 k,非 \k)
var reg = new Regex(@"\b(?\w+)\s+\k\b");

string text = "what the hell are you you talking about?";
var match = reg.Match(text);
Console.WriteLine(match.Value); // "you you"
Console.WriteLine(match.Groups["word"].Value); // "you"

RegexOptions 枚舉完整解析

選項說明典型用途
Singleline. 匹配任意字符(含換行)跨行匹配 HTML/JSON
Multiline^$ 匹配行首行尾(非字符串首尾)多行文本逐行處理
IgnorePatternWhitespace忽略模式中的空白,允許註釋 #編寫可讀性強的複雜正則
IgnoreCase不區分大小寫匹配關鍵字搜索、標簽匹配
ECMAScript限制 \w\d\s 僅匹配 ASCIIJS 兼容模式
RightToLeft從右向左匹配特定解析場景
Compiled編譯為 IL,啟動慢但匹配快高頻復用正則
ExplicitCapture普通括號 () 僅分組不捕獲避免無意捕獲影響性能
CultureInvariant使用不變文化進行比較跨文化一致性

RegexOptions.Compiled 性能權衡

指標未編譯已編譯
啟動速度快慢(最多 60 倍)
內存佔用少多(每正則 5-15KB)
匹配速度基準最多提升 10 倍
內存釋放自動進程結束前常駐

建議:僅對高頻復用、生命周期長的正則使用 Compiled;一次性或低頻正則不建議。

ECMAScript 模式限制

  • 只能與 IgnoreCase、Multiline、Compiled 組合
  • \10 僅為反向引用 1 + 字符 '0',非八進制
  • \w\d\s 及其反向類僅匹配 ASCII

分組編號規則

C# 正則分組編號順序:

  1. 分組 0:整個匹配結果
  2. 未命名分組:按左括號順序編號
  3. 命名分組:最後編號

// 示例:(\w)(?\d+)(\s+)
// 分組編號:
// 0: 整個匹配
// 1: (\w)          - 未命名,第1個左括號
// 2: (\s+)         - 未命名,第2個左括號
// 3: (?\d+) - 命名分組,最後編號

替換模式特殊字符序列

序列替換內容示例
$& / $0整個匹配文本Regex.Replace("123", @"\d+", "[$&]") → "[123]"
$1, $2...編號捕獲組文本Regex.Replace("1+1=3", @"1\+1=(\d)", "不是$1") → "不是3"
${name}命名捕獲組文本Regex.Replace("1+1=3", @"1\+1=(?\d)", "不是${r}") → "不是3"
$`匹配文本之前的文本Regex.Replace("ABC123", @"\d+", "前:$`") → "前:ABCABC"
$'匹配文本之後的文本Regex.Replace("123ABC", @"\d+", "後:$'") → "後:ABCABC"
$$字面量 $Regex.Replace("100", @"\d+", "價格:$$$&") → "價格:$100"
$_原始輸入字符串副本Regex.Replace("ABC123", @"\d+", $_) → "ABC123ABC123"
$+最後一個捕獲組文本.NET 特有

替換實戰:關鍵詞生成 SQL


string keywords = File.ReadAllText(@"D:\daoru.txt", Encoding.Default);
// 關鍵詞每行一個,如:
// 中山大道
// 粵墾路

var reg = new Regex(@".+"); // 默認 . 不匹配換行,完美適配逐行
string sql = reg.Replace(keywords, 
    "INSERT INTO Keywords VALUES (196, 'admin', 'admin', '$&')");

// 處理換行符問題(關鍵!)
// Windows 換行 \r\n,匹配 .+ 會包含 \r
// 解決:替換後移除 \r
sql = sql.Replace("\r", ""); 

File.WriteAllText(@"D:\output.sql", sql);
// 生成:
// INSERT INTO Keywords VALUES (196, 'admin', 'admin', '中山大道')
// INSERT INTO Keywords VALUES (196, 'admin', 'admin', '粵墾路')

Regex.CompileToAssembly:正則庫組件化

將常用正則預編譯為 DLL,提高重用性和啟動性能:


using System.Text.RegularExpressions;

var patterns = new[]
{
    new RegexCompilationInfo(
        @"\d{4}-\d{2}-\d{2}",           // 模式
        RegexOptions.Compiled | RegexOptions.ExplicitCapture, // 選項
        "DateRegex",                      // 類名
        "MyRegexLib",                     // 命名空間
        true,                             // public
        null                              // 超時
    ),
    // 更多模式...
};

Regex.CompileToAssembly(patterns, new AssemblyName("MyRegexLib"));
// 生成 MyRegexLib.dll,其他項目引用即可使用:
// var regex = new MyRegexLib.DateRegex();
// regex.Match("2024-01-15");

實戰經驗總結

  1. 雙引號用逐字字符串雙寫:@"""" 最不易出錯
  2. 複雜正則用 IgnorePatternWhitespace:分行寫、加註釋、可維護
  3. 高頻正則用 Compiled + 靜態 readonly:避免重複編譯開銷
  4. 替換時警惕 $` $' $_:易誤解語義,充分測試
  5. 跨平台注意換行符:Windows \r\n 會被 .+ 匹配,需後處理
  6. 編碼讀取用 Encoding.Default:中文環境下讀取 ANSI 文本

總結

C# 正則表達式功能強大但細節多:雙引號轉義用逐字字符串雙寫,分組編號有序,替換模式豐富,編譯優化需權衡。掌握 RegexOptions 組合、命名分組、替換序列、預編譯組件化等進階技巧,能顯著提升文本處理代碼的性能、可讀性與維護性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved