代码之家  ›  专栏  ›  技术社区  ›  oopbase Jayachandran Murugesh

使用正则表达式分析字符串

  •  1
  • oopbase Jayachandran Murugesh  · 技术社区  · 15 年前

    首先让我给你发一些字符串示例:

    string_position = ("\"%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)
    
    string_position = ("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)
    

    所以我想解析这些字符串,但我不知道如何开始。因此,我希望每个字符串有两个数组,例如(字符串2):

    array_a[0] = STK_PD_BEZ|%s;
    array_b[0] = POSNR;
    
    array_a[1] = STK_ID|%s;
    array_b[1] = ORDERID;
    

    等。。。

    谢谢你的帮助。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Nick Martyshchenko    15 年前

    只是快速实施,希望能有用。我不喜欢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