[英]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.