[英]regex extract match for every fourth comma in the string
我正在嘗試創建一個正則表達式,以獲取以下字符串的輸出,並以4個逗號分隔的值的形式出現。 我嘗試了一些方法,但是它僅選擇每個逗號分隔的值。 我不知道如何獲得所需的輸出。
我嘗試過的正則表達式:
".*?"(?=,|$)
數據:
"T","Success","2","2","T","Success","6458960","1","F,"You do not have sufficient credit.","6458962","1"
要求:
"T","Success","2","2"
"T","Success","6458960","1"
"F,"You do not have sufficient credit.","6458962","1"
更新: “ F也用雙引號引起來,這是一個錯字,抱歉!”
“ T”,“成功”,“ 2”,“ 2”,“ T”,“成功”,“ 6458960”,“ 1”,“ F”,“您沒有足夠的信用。”,“ 6458962”, “ 1”
您只需要String.Split
:
string[] fields = str.Split(',');
for (int i = 0; i < fields.Length; i += 4)
Console.WriteLine(string.Join(",", fields.Skip(i).Take(4)));
輸出:
"T","Success","2","2"
"T","Success","6458960","1"
"F,"You do not have sufficient credit.","6458962","1"
假定這不是真的csv數據。 否則,我建議使用支持引號的真實CSV解析器 。 但是似乎它們還是被破壞了( ,"1","F,.
,所以F沒有用引號引起來)。
您可以使用以下正則表達式,但前提是F也必須用引號引起來:
((?:".+",){3}(?:".+"))
結果是:
匹配1 1. [0-21] "T","Success","2","2"
匹配2 1. [22-49] "T","Success","6458960","1"
匹配3 1. [50-104] "F","You do not have sufficient credit.","6458962","1"
如果數據的格式確實不一致,則必須手動解析或使用or條件修改正則表達式。
((?:"[^"]*"|[^,"])*(?:,(?:"[^"]*"|[^,"])*){3}),?
(?:"[^"]*"|[^,"])*
將匹配逗號之間的值(可選,用引號引起來)。 引號被轉義為""
。
(X(?:,X){3}),?
其中X
是模式#1,它將匹配四個逗號分隔值和一個可選尾隨逗號的序列。 逗號必須正確匹配空白值( ,,foo,
)。
如果保證值始終帶有引號,則可以刪除|[^,"]
和,?
。
您可以嘗試使用此正則表達式,但是正則表達式有一個問題:您需要修剪最后一個Comma
,甚至字符串中還有更多的Comma
,而不是4個Comma
倍數,它也可以正常工作
string patten = @"(?<=^(?:(?:[^,]*,){4})+)";
string text = @"""T"",""Success"",""2"",""2"",""T"",""Success"",""6458960"",""1"",""F,""You do not have sufficient credit."",""6458962"",""1""";
foreach (var tmp in Regex.Split(text, patten))
{
Console.WriteLine(tmp.TrimEnd(','));
}
我會避免使用正則表達式,除非您確實需要它,否則通常很難理解。
有趣的是,這里是一個Linq解決方案:
var data = @"""T"",""Success"",""2"",""2"",""T"",""Success"",""6458960"",""1"",""F,""You do not have sufficient credit."",""6458962"",""1""";
var res = data.Split(',')
.Select((x ,i) => new { Pos = i / 4, Val = x })
.GroupBy(x => x.Pos)
.Select(g => string.Join(",", g.Select(x => x.Val)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.