2013-07-10 19 views
1

我有一個字符串,我需要與另一個字符串數組相匹配。如果我發現匹配這兩個數組值,那麼我必須從字符串中拆分數字值,並用該數值添加,並用新值附加實際字符串。我嘗試了一些拆分和連接。但我沒有得到正確和有效的方法來解決問題。以下是我的情況。最簡單的方法增加一個實際的字符串值

實際字符串:

BK-TS00023,X1-TS00000101,X4-A10000024,Y1-3, 

比較字符串

BK Books  // Compare first two characters => BK Books matches with BK-TS00023 
X1 Serials // Compare first two characters => X1 Serials matches with X1-TS00000101 

所以,當我發現與之相匹配的這些字符串,我需要得到像的數值, 並將值增加1.然後附加默認字符串。由此產生的字符串將是這樣的。

結果字符串

'BK-TS00024', 
'X1-TS00000102', 
'X4-A10000025', 
'Y1-4' 

我嘗試下面的方法。請任何人都幫我提供正確的方法來做這種情況。

代碼

InfoType="BK Books"; // or "X1 Serials" // or etc .. 
var splitInfo = InfoType.Split(' '); 
     var SiteFileInfo = Db.SiteFiles.Where(asd => asd.Code == "AutoBarcode").Select(asd => asd.Line1).FirstOrDefault(); 
     var splitSiteFile = SiteFileInfo.Split(','); 
     int cnt = 0; 
     foreach (var s in splitSiteFile) 
     { 
      cnt += 1; 
      if (s.Contains(splitInfo[0])) 
      { 

       //var infoSiteSplit = s.Split('-'); 
       var olyNumber = Regex.Split(s, @"(?<=\p{L})(?=\p{N})"); 
       int i = 0; 
       string Truncstring = ""; 
       foreach (var a in olyNumber) 
       { 
        bool result = int.TryParse(a, out i); 
        if (result) 
        { 
         i += 1; 
         int befconv = Convert.ToInt32(a); 
         Truncstring = s.Replace(befconv.ToString(), i.ToString()); 
        } 
       } 
       splitSiteFile[cnt - 1] = Truncstring; 
       string JoinString = string.Join(",", splitSiteFile); 
       Db.ExecuteStoreCommand("update SiteFile set Line1={0} where Code={1}", JoinString, "AutoBarcode"); 
       Db.SaveChanges(); 
       return Truncstring; 
      } 
     } 
+0

這裏您的預期輸出是什麼? 'BK-TS00024 X1-TS00000102'? – jomsk1e

+0

它的兩個字符串..'BK-TS00024','X1-TS00000102'..請參閱更新代碼。 – UniqueChar

回答

1

您可以使用Regex.Replace Method (String, String, MatchEvaluator)(和可選,代表的不是MatchEvaluator實例)。

試試這個(這將與1場中的過濾器的所有比賽增加):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var input = "BK-TS00023,X1-TS00000101,X4-A10000024,Y1-3,"; 
     var filter = new[] { "BK Books", "X1 Serials" }; 
     Console.WriteLine(input); 
     var result = IncreaseWithFilter(input, filter); 
     Console.WriteLine(result); 
    } 

    private static string IncreaseWithFilter(
     string input, 
     IEnumerable<string> filter) 
    { 
     var truncatedFilter = filter.Select(f => f.Substring(0, 2)); 
     var result = Regex.Replace(input, @"([^,].*?)\d+(?=,)", 
      (match1) => 
      { 
       var value = match1.Value; 
       if (truncatedFilter.Any(f => match1.Value.StartsWith(f))) 
       { 
        value = Regex.Replace(match1.Value, @"(?<=)\d+", 
         (match2) => 
         { 
          return (Convert.ToInt32(match2.Value) + 1) 
           .ToString() 
           .PadLeft(match2.Value.Length, '0'); 
         }); 
       } 
       return value; 
      }); 
     return result; 
    } 
} 

輸出:在你的代碼

BK-TS00023,X1-TS00000101,X4-A10000024,Y1-3, 
BK-TS00024,X1-TS00000102,X4-A10000024,Y1-3, 

使用範例:

InfoType = "BK Books"; 
var SiteFileInfo = Db.SiteFiles 
    .Where(asd => asd.Code == "AutoBarcode") 
    .Select(asd => asd.Line1) 
    .FirstOrDefault(); 
var result = IncreaseWithFilter(
    SiteFileInfo, 
    new[] { InfoType }); 
1

何不你是否簡單地把字符串的正確部分(數字部分),將它轉換爲int,將其增加並再次轉換爲字符串?

喜歡的東西:

public string IncreaseByOne(string original) { 
    var numberpart = ""; 
    var index = original.Length - 1; 
    while (index != 0) { 
    var oneletter = original.Substring(index, 1); 
    var isint = int.TryParse(oneletter, out digit); 
    if (!isint) break; 
    numberpart += oneletter; 
    --index; 
    } 
    var firstpart = original.Substring(0, orignal.Length - numberpart.Length); 
    var padlength = numberpart.Length; 
    int value; 
    int.TryParse(numberpart, out value); 
    var result = ++value.ToString().PadLeft(padlength, '0'); 
    return firstpart + result; 
} 
1

只是作爲一個額外的提示,可以用零的增加INT,而不是計算字符串的長度後,簡化了字符串創建和做PadLeft,你也可以採取一個int並使用StringFormat IFormatProvider添加前導零:

string paddedString = String.Format("TS{1:00000}", count); 
//when count = 24, should output "TS00024" 
相關問題