簡體   English   中英

正則表達式提取字符串中每四個逗號的匹配項

[英]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}),?
  1. (?:"[^"]*"|[^,"])*將匹配逗號之間的值(可選,用引號引起來)。 引號被轉義為""

  2. (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM