2011-05-06 69 views
0

我有大約10個從記錄的數據,我希望能夠以定義返回這個數據的字符串的佈局,留下一些作品出來的選項。我的想法是使用枚舉給我的令牌/字段整數值,然後有一個像{0}{1}{2}{3}{4} - {3}{1} [{8}]複雜的東西。令牌的含義與我數據庫中的字段有關。舉例來說,我的這個枚舉與我的代幣有關。解析自定義數據令牌和C#與值替換

AccountMask = 0, 
AccountLast4 = 1, 
AccountFirstDigit = 2, 
AccountFirstLetter = 3, 
ItemNumber = 4, 
Amount = 5 

帳戶面具就像VXXXXX1234一個字符串,其中V是簽證,而1234是該卡的最後4位數字。有時客戶需要V,有時他們需要第一個數字(很容易將卡類型轉換爲第一個數字)。

我的目標是創造一些可重複使用,以產生一個格式字符串,然後將使用與數字相關的數據令牌裏面做的到位替代數據的使用令牌的字符串。

所以,對於使用上面我列舉的面具,如果我想定義的格式9{2}{1}{4:[0:0000000000]}

如果項目編號爲678934

那麼這將轉化爲9412340000678934一個例子,其中令牌的內部4成爲該值的String.Format的定義。此外,置於令牌周圍的數據將被忽略並保留。

我的問題來處理字符串和最佳做法。有人告訴我說,如果您要即時創建它們,正則表達式可能會很昂貴。作爲CS專業,我有一種感覺,「正確」(無論複雜)解決方案是爲我的令牌製作詞法分析器。我沒有經驗在C#中編寫詞法分析器/解析器,因此我不確定最佳實踐。我正在尋找一個高效且易於調整的系統。

+0

我是否理解正確:你需要將一些數據打包成一個字符串,然後將其放大,然後解壓縮? – 2011-05-06 20:35:13

+0

我希望每個用戶都能夠將單個數據字符串定義爲單個格式字符串。他們必須能夠從數據庫中的字段中選擇和選擇可用的信息片段,並且可以用空格,分隔字符等來定義格式。另外,用於數據替換的每個標記都必須允許其自己的格式來定義數據如何被替換(例如,在上面的實例中用0填充項目編號) – Josh 2011-05-06 20:49:26

回答

0

我最後決定將正則表達式作爲在類中的靜態對象,然後通過匹配循環來執行替換和構建我的令牌。

var token = request.TokenFormat; 

var matches = tokenExpression.Matches(request.TokenFormat); 

foreach (Match match in matches) 
{ 
    var value = match.Value; 
    var tokenCode = (Token)Convert.ToInt32(value.Substring(1, (value.Contains(":") ? value.IndexOf(":") : value.IndexOf("}")) - 1)); 

    object data = null; 

    switch (tokenCode) 
    { 
     case Token.AccountMask: 
      data = accountMask; 
      break; 
     case Token.AccountLast4: 
      data = accountMask.Substring(accountMask.Length - 4); 
      break; 
     case Token.AccountFirstDigit: 
      string firstLetter = accountMask.Substring(0, 1); 

      switch (firstLetter.ToUpper()) 
      { 
       case "A": 
        data = 3; 
        break; 
       case "V": 
        data = 4; 
        break; 
       case "M": 
        data = 5; 
        break; 
       case "D": 
        data = 6; 
        break; 
      } 

      break; 
     case Token.AccountFirstLetter: 
      data = accountMask.Substring(0, 1); 
      break; 
     case Token.ItemNumber: 
      if(item != null) 
       data = item.PaymentId; 
      break; 
     case Token.Amount: 
      if (item != null) 
       data = item.Amount; 
      break; 
     case Token.PaymentMethodId: 
      if (paymentMethod != null) 
       data = paymentMethod.PaymentMethodId; 
      break; 
    } 

    if (formatExpression.IsMatch(value)) 
    { 
     Match formatMatch = formatExpression.Match(value); 
     string format = formatMatch.Value.Replace("[", "{").Replace("]", "}"); 

     token = token.Replace(value, String.Format(format, data)); 
    } 
    else 
    { 
     token = token.Replace(value, String.Format("{0}", data)); 
    } 
} 

return token; 
0

我看這個問題,我立刻想到,該解決方案是非常簡單的;存儲您要使用,用您希望包括各種數據字段的恆定值,以及口罩進入一個不斷調用的String.Format()的面具:

const string CreditCardWithFirstLetterMask = "{3}XXXXXXXXXXX{1}"; 
const string CreditCardWithFirstDigitMask = "{2}XXXXXXXXXXX{1}"; 

... 

var formattedString = String.Format(CreditCardWithFirstDigitMask, 
    record.AccountMask, 
    record.AccountLast4, 
    record.AccountFirstDigit, 
    record.AccountFirstLetter, 
    record.ItemNumber, 
    record.Amount); 
+0

我不能像這樣存儲它們。格式將由用戶定義。 – Josh 2011-05-06 20:49:55