在 C# 處理日誌、報表或結構化文本時,常需「先定位到特定行,再從該行擷取特定模式的資料」。本文示範如何分割多行字串、取得第 100 行(索引 99),並使用正則表達式提取 id 後緊鄰的 10 位數字。
string rawText = "...您的多行字串內容...";
// 1. 分割行 (支援 Windows \r\n、Linux \n、Mac \r)
string[] lines = rawText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None);
// 2. 邊界檢查:確保至少有 100 行
if (lines.Length >= 100) {
string targetLine = lines[99]; // 第 100 行 (索引 99)
// 3. 正則匹配:id 後面連續 10 位數字
// (?<=id) 為正向顧後斷言,不消耗字元,確保緊接在 id 之後
// \d{10} 匹配恰好 10 位數字
string pattern = @"(?<=id)\d{10}";
Match match = Regex.Match(targetLine, pattern);
if (match.Success) {
string result = match.Value; // 取得 10 位數字字串
Console.WriteLine($"擷取結果: {result}");
} else {
Console.WriteLine("該行不符合模式或無 10 位數字");
}
} else {
Console.WriteLine("行數不足 100 行");
}
使用 new[] { "\r\n", "\r", "\n" } 而非單一 "\r\n",可相容 Windows/Linux/Mac 產生的文本檔案。
(?<=id):正向顧後斷言,只檢查前方是否為 id,匹配結果不包含 id 本身。\d{10}:匹配恰好 10 位數字。若需「至少 10 位」可用 \d{10,}。id 可能為大寫或混合大小寫,可加 RegexOptions.IgnoreCase。Substring 配合 IndexOf若不想用正則,且格式極度固定(如 id1234567890 固定前綴),可用:
int idx = targetLine.IndexOf("id");
if (idx >= 0 && idx + 2 + 10 <= targetLine.Length) {
string result = targetLine.Substring(idx + 2, 10); // 跳過 "id" 取 10 碼
// 建議再驗證 result.All(char.IsDigit)
}
lines.Length,避免索引越界。idxxxxxxxxxx,Regex.Match 只取第一組;需全部請用 Regex.Matches 迭代。id: 1234567890 或 id = 1234567890,模式需調整為 (?<=id\s*[:=]\s*)\d{10}。「分割行 → 取目標行 → 正則擷取」是處理結構化文本的標準套路。善用 Split 多重分隔符與 Regex 斷言語法,能以極少程式碼穩健完成複雜擷取任務。