字符串替换个性化代码生成器

时间:2010-04-20 08:23:50

标签: c# string replace

我必须使用具有预定义键的用户可配置字符串来执行自动代码生成器,并且无法找到一种好方法。 例如,一个字符串

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

可以生成代码

OT-C0001-20100420-01

OT-C0001-20100420-02

我想过使用RegExpr.Replace(),但如果客户的代码是{##}

,我会遇到问题

欢迎任何帮助! (对不起我的英语)

3 个答案:

答案 0 :(得分:1)

您可以使用string.Format()

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

{x}是要替换字符串的占位符。

答案 1 :(得分: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的解决方案,则必须仅使用委托替换lambda表达式部分(显然设置为委托方法可用,例如类成员)

编辑2: 例如,您可以在以下代码中结合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);
    }
}

答案 2 :(得分: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();

但是如果您为同一个令牌进行多次替换,这会更有用。看起来你需要Elisha

建议的String.Format