2010-04-20 69 views
0

我必須做一個自動代碼生成器與用戶可配置的字符串與預定義的鍵,並找不到一個好的方法來做到這一點。 例如,一個字符串字符串替換個性化代碼生成器

OT-{CustomCode}-{Date}-{##}

可以生成代碼

OT-C0001-20100420-01

OT-C0001-20100420-02

我想用RegExpr.Replace(),但我會如果代碼問題的客戶是{##}

任何歡迎光臨! (和我的英語很抱歉)

回答

1

您可以使用string.Format()

string generated = string.Format("OT-{0}-{1}-{2}", code, date, num); 

{x}是佔位符被替換字符串。

0

你的意思是自動生成的代碼定義,例如:

Foo {##} , Bar {Date} 

,這將產生:

Foo 01 , Bar 20100420 
Foo 02 , Bar 20100420 

不是嗎?

我認爲RegExpr.Replace()是一個很好的解決方案,到##問題,你可以做這樣的事情:

private void Generate() 
{ 
    Regex doubleSharpRegEx = new Regex("{#+}"); 
    string customString = "Foo {####}"; 
    string[] generatedCodes = new string[3]; 
    for (int i = 0; i < generatedCodes.Length; i++) 
    { 
     string newString = doubleSharpRegEx.Replace(customString, 
                match => 
                { 
                 // Calculate zero padding for format 
                 // remove brackets 
                 string zeroPadding = match.Value.Substring(1, match.Value.Length - 2); 
                 // replace # with zero 
                 zeroPadding = zeroPadding.Replace('#', '0'); 

                 return string.Format("{0:" + zeroPadding + "}", i); 
                }); 
     generatedCodes[i] = newString; 
    } 
} 

和數組generatedCodes包含:

Foo 0000 
Foo 0001 
Foo 0002 
Foo 0003 

編輯: Lambdas表達式僅適用於框架3.5。 如果您需要2.0的解決方案,你只能更換一個委託(明明設置我可委派的方法如類成員)

EDIT 2 lambda表達式部分: 您可以結合2回答,例如下面的代碼:

private void Generate2() 
{ 
    Regex customCodeRegex = new Regex("{CustomCode}"); 
    Regex dateRegex = new Regex("{Date}"); 
    Regex doubleSharpRegex = new Regex("{#+}"); 

    string customString = "Foo-{##}-{Date}-{CustomCode}-{####}"; 

    string newString = customCodeRegex.Replace(customString, "{0}"); 
    newString = dateRegex.Replace(newString, "{1}"); 
    newString = doubleSharpRegex.Replace(newString, 
    match => 
    { 
     string zeroPadding = match.Value.Substring(1, match.Value.Length - 2); 
     zeroPadding = zeroPadding.Replace('#', '0'); 
     return "{2:" + zeroPadding + "}"; 
    }); 

    string customCode = "C001"; 
    string date = DateTime.Today.ToString("yyyyMMdd"); 
    string[] generatedCodes = new string[3]; 
    for (int i = 0; i < generatedCodes.Length; i++) 
    { 
     generatedCodes[i] = string.Format(newString, customCode, date, i); 
    } 
} 
0

StringBuilder類提供了高效的替代:

string code = "C0001"; 
DateTime date = DateTime.Now; 
int count = 1; 
String formatString = "OT-{CustomCode}-{Date}-{##}"; 

StringBuilder sb = new StringBuilder(formatString); 
sb.Replace("{CustomCode}", code); 
sb.Replace("{Date}", date.ToString("yyyyMMdd")); 
sb.Replace("{##}", count); 
string result = sb.ToString(); 

但這個如果你做了同樣的記號多個內容替換爲更加有用。看起來像你需要String.Format建議由Elisha