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

C# 正則表達式提取特定頭尾標記間內容:貪婪與非貪婪模式實戰

     編輯:程式設計綜合問答

需求

字符串:小明:今天騎單車上班 小紅:今天休息
提取:今天騎單車上班(頭標記「小明:」,尾標記「小紅:」)

正則方案

string input = "小明:今天騎單車上班 小紅:今天休息";
string pattern = @"小明:(.*?)小紅:";  // 非貪婪匹配
Match match = Regex.Match(input, pattern);
if (match.Success) {
    string result = match.Groups[1].Value; // "今天騎單車上班"
}

關鍵點解析

進階場景擴展

// 1. 尾標記不固定(任意「姓名:」)
string pattern2 = @"小明:(.*?)(?=\s\w+:|$)"; // 正向預查:後面是「姓名:」或字符串結尾

// 2. 多行模式(內容含換行)
string pattern3 = @"小明:([\s\S]*?)小紅:"; // [\s\S] 匹配含換行任意字符
// 或啟用 RegexOptions.Singleline

// 3. 提取所有同類片段
var matches = Regex.Matches(input, @"(\w+:)(.*?)(?=\s\w+:|$)");
foreach (Match m in matches) {
    Console.WriteLine($"{m.Groups[1]} -> {m.Groups[2]}");
}

性能與最佳實踐

  • 預編譯靜態正則:static readonly Regex Reg = new Regex(pattern, RegexOptions.Compiled);
  • 避免災難性回溯:盡量具體化字符集,不用 .* 改用 [^:]*(非冒號字符)。
  • 大量數據處理用 Regex.Replace 替換而非逐個 Match。

非正則替代方案

// 簡單分割場景
var parts = input.Split(new[] { "小明:" }, StringSplitOptions.RemoveEmptyEntries);
if (parts.Length > 1) {
    var target = parts[1].Split(new[] { "小紅:" }, StringSplitOptions.RemoveEmptyEntries)[0];
}

正則表達式強大靈活,但簡單固定分隔符場景 Split 更直觀高效。按複雜度選擇工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
元素含義
小明:字面頭標記(含中文冒號)
(.*?)捕獲組:任意字符(除換行),**非貪婪**(最少匹配)
小紅:字面尾標記
Groups[1]第一個捕獲組內容(不含頭尾標記)