需求
字符串:小明:今天騎單車上班 小紅:今天休息
提取:今天騎單車上班(頭標記「小明:」,尾標記「小紅:」)
正則方案
string input = "小明:今天騎單車上班 小紅:今天休息";
string pattern = @"小明:(.*?)小紅:"; // 非貪婪匹配
Match match = Regex.Match(input, pattern);
if (match.Success) {
string result = match.Groups[1].Value; // "今天騎單車上班"
}
關鍵點解析
| 元素 | 含義 |
小明: | 字面頭標記(含中文冒號) |
(.*?) | 捕獲組:任意字符(除換行),**非貪婪**(最少匹配) |
小紅: | 字面尾標記 |
Groups[1] | 第一個捕獲組內容(不含頭尾標記) |
進階場景擴展
// 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 更直觀高效。按複雜度選擇工具。
- 上一篇文章: Android Ant 混淆打包 ProGuard 配置優化與警告消除
- 下一篇文章: Python MySQL 查詢結果元組輸出亂碼:正確訪問字段值而非打印元組
Copyright ©
程式碼之家 All Rights Reserved