只是快速实施,希望能有用。我不喜欢regex来完成这个特殊的任务。我认为简单的解析器就足够了。
// const string test = "STK_PD_BEZ|%s|STK_ID|%s|STK_EBENE|0|ID|%s\r\nSTK_ID|%s|ORDERPOS|%s|STK_EBENE|1|STK_PD_BEZ|%s|STK_FLAENGE|%.2f|STK_FBREITE|%.2f|STK_FDICKE|%.2f|ID|%s|PARENTID|%s\r\n,POSNR,ORDERID,POSNR_NR_ID,ORDERID,POSSTR,CP90NAME,WIDTH,DEPTH,HEIGHT,ARTNR_NR_ID,POSNR_NR_ID";
const string test = "\"%s\";\"%s\";\"%s\";\"\";\"%s\"\r\n\"%s\";\"%s\";\"%s\";\"%s - %s\";\"%s\";\"%.0f\";\"FR\";\"%.2f\";\"%.2f\";\"%.2f\";\"%s\";\"%s\";\"%s\";\"%s\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"\";\"B\"\r\n,POSNR_NR_ID,POSNR_NR_ID,POSNR,POSNR_NR_ID,ARTNR_NR_ID,POSNR_NR_ID,CP90NAME,TEXT1,TEXT2,ARTNR_NR_ID,CNT,WIDTH,HEIGHT,DEPTH,INFO1,INFO2,INFO3,INFO4";
// [0] - format string
// [1..n] - arguments for format
string[] args = test.Split(',');
// Source parts divided by delimiters. You can extend it.
string[] parts = args[0].Split("|\r\n;-".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
// Format - arg pair
var parsed = new List<Tuple<string, string>>();
// Current format string
var format = new List<string>();
// Start from 1 since we skip format string
int currentValue = 1;
// Building
foreach (var part in parts)
{
if (part.Contains("%"))
{
format.Add(part);
parsed.Add(Tuple.Create(string.Join("|", format), args[currentValue++]));
format.Clear();
}
else format.Add(part);
}
// Printing
foreach (var pair in parsed)
{
Console.WriteLine("{0} = {1}", pair.Item1, pair.Item2);
}
Console.ReadLine();
输出:
STK_ID |%s=订单号
STK_EBENE | 0 | ID |%s=位置编号
STK_ID |%s=订单号
STK_EBENE | 1 | STK_PD|u BEZ |%s=cp90名称
STK_FLAENGE |%.2f=宽度
STK_FBREITE |%.2f=深度
ID |%s=艺术作品编号
PalTiDe%s= PasnrnnRyID
输出2:
“%s”=位置编号”
“%s”=位置编号”
“%s”=位置号
“|”%s“=位置编号”
“%s”=艺术品编号”
“%s”=CP90NAME
%s=文本1
%s“=文本2
“%s”=艺术品编号”
“%.0f”=碳纳米管
“%.2f”=高度
“%.2f”=深度
“%s”=信息1”
“%s”=信息2”
“%s”=信息3”
“%s”=信息4”
更新
:
Syntax diagrams