从字符串中以空格分隔和用引号引起来的元素中获取数据字段

时间:2018-09-24 01:22:35

标签: c# .net regex string split

要处理api响应,我需要先将字符串拆分为单独的字符串字段。字段的数量是固定的(每个字段始终存在),但是“空”字段可以表示为?""。以\n终止。单个字段可能包含也可能不包含在两个转义的引号中,但是只有八个字段可能包含空格和其他字符,例如/%? :

"A single field / % ?"

,还可以包含数字或正斜杠,如下所示。

两个字符串的示例,每个字符串包含20个字段:

14 S 20 ? OSE ? NHY "Norsk Hydro" NO0005052605 1 "20180921" 48.6 2068998276 NOK S I ? ? 1 Y\n

40 S 20 ? OSE ? "" "Boa SBL AS 13/18 FRN C" NO0010675051 1 "20180706" 45 0 NOK B ? ? ? 0.01 Y\n

什么是安全有效的方法?

我知道我可以使它工作,但它不是很优雅。

1 个答案:

答案 0 :(得分:0)

您可以使用Regex沿这些方向查找内容(您需要为引用的值做更多的工作)...

var value = @"14 S 20 ? OSE ? NHY ""Norsk Hydro"" NO0005052605 1 ""20180921"" 48.6 2068998276 NOK S I ? ? 1 Y"+"\n";
var pattern = new Regex(@"^(""(.*?)""|[^ ""]+)( (""(.*?)""|[^ ""]+)){19,19}\n$");
var match = pattern.Match(value);
if (match.Success)
{
    for (int ctr = 1; ctr < match.Groups.Count; ctr++)
    {
        Console.WriteLine("   Group {0}:  {1}", ctr, match.Groups[ctr].Value);
        int captureCtr = 0;
        foreach (Capture capture in match.Groups[ctr].Captures)
        {
            Console.WriteLine("      Capture {0}: {1}",
                captureCtr, capture.Value);
            captureCtr++;
        }
    }
}

或者,如果您需要非正则表达式解决方案:使用string.Split,将空间用于Queue<string>的构造函数中,然后循环处理队列,Dequeue将每个项目放在时间。

如果该项目以\"开头,则需要进行另一个循环DequeueList<string>中,直到相应的项目以右引号结束为止,此时,使用{ {1}}。