繁体   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