要处理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
什么是安全有效的方法?
我知道我可以使它工作,但它不是很优雅。
答案 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
将每个项目放在时间。
如果该项目以\"
开头,则需要进行另一个循环Dequeue
到List<string>
中,直到相应的项目以右引号结束为止,此时,使用{ {1}}。