簡體   English   中英

使用RegEx解析字符串

[英]Parsing strings by using RegEx

首先讓我向您發布一些示例字符串:

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;

等等...

希望你能理解我的問題。 我必須找到每個%s的補充“變量”。 因此,該算法必須使用與我發布的字符串相似的任何字符串。

感謝您的任何幫助。

只需快速實施,希望它將對您有所幫助。 對於這個特殊的任務,我不贊成使用正則表達式。 我認為簡單的解析器就足夠了。

        // 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_PD_BEZ |%s = POSNR

STK_ID |%s = ORDERID

STK_EBENE | 0 | ID |%s = POSNR_NR_ID

STK_ID |%s = ORDERID

ORDERPOS |%s = POSSTR

STK_EBENE | 1 | STK_PD_BEZ |%s = CP90NAME

STK_FLAENGE |%.2f =寬度

STK_FBREITE |%.2f =深度

STK_FDICKE |%.2f =高度

ID |%s = ARTNR_NR_ID

PARENTID |%s = POSNR_NR_ID

輸出2:

“%s” = POSNR_NR_ID

“%s” = POSNR_NR_ID

“%s” = POSNR

“” |“%s” = POSNR_NR_ID

“%s” = ARTNR_NR_ID

“%s” = POSNR_NR_ID

“%s” = CP90NAME

“%s = TEXT1

%s“ = TEXT2

“%s” = ARTNR_NR_ID

“%.0f” =碳納米管

“ FR” |“%。2f” =寬度

“%.2f” =高度

“%.2f” =深度

“%s” = INFO1

“%s” = INFO2

“%s” = INFO3

“%s” = INFO4


更新

沒有正式的規范,解析器的代碼將是憑經驗而不是形式上有效的。 因此,首先,我建議您先為您的輸入指定規格,然后再輕松創建可以接受所有有效字符串的解析器。 例如,您可以從語法圖開始

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM