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

C# 个性化代码生成器的字符串替换,c#,string,replace,C#,String,Replace,我必须做一个自动代码生成器与用户可配置的字符串与预定义的键,不能找到一个好的方法来做它。 例如,字符串 OT-{CustomCode}-{Date}-{##} 可以生成代码 OT-C0001-20100420-01 OT-C0001-20100420-02 我曾想过使用RegExpr.Replace(),但如果客户的代码是{##},我就会遇到问题 欢迎任何帮助!(对不起我的英语)您可以使用: {x}是要替换的字符串的占位符。您可以使用: {x}是要替换的字符串的占位符。您的意思是自动生成的代码定

我必须做一个自动代码生成器与用户可配置的字符串与预定义的键,不能找到一个好的方法来做它。 例如,字符串

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

可以生成代码

OT-C0001-20100420-01

OT-C0001-20100420-02

我曾想过使用RegExpr.Replace(),但如果客户的代码是{##},我就会遇到问题

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

您可以使用:

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

您可以使用:


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

您的意思是自动生成的代码定义是例如:

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;
    }
}
编辑: Lambdas表达式仅适用于框架3.5。 如果您需要2.0的解决方案,则只能用委托替换lambda表达式部分(显然,设置i可用于委托方法,例如类成员)

编辑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);
    }
}
private void Generate2()
{
Regex customCodeRegex=新的正则表达式(“{CustomCode}”);
Regex-dateRegex=newregex(“{Date}”);
正则表达式doubleSharpRegex=新正则表达式(“{#+}”);
string customString=“Foo-{{{#}-{Date}-{CustomCode}-{####}”;
string newString=customCodeRegex.Replace(customString,{0});
newString=dateRegex.Replace(newString,{1});
newString=doubleSharpRegex.Replace(newString,
匹配=>
{
字符串zeroPadding=match.Value.Substring(1,match.Value.Length-2);
zeroPadding=zeroPadding.Replace('#','0');
返回“{2:”+zeroPadding+“}”;
});
字符串customCode=“C001”;
字符串日期=DateTime.Today.ToString(“yyyyMMdd”);
string[]generatedCodes=新字符串[3];
对于(int i=0;i
您的意思是自动生成的代码定义是例如:

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;
    }
}
编辑: Lambdas表达式仅适用于框架3.5。 如果您需要2.0的解决方案,则只能用委托替换lambda表达式部分(显然,设置i可用于委托方法,例如类成员)

编辑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);
    }
}
private void Generate2()
{
Regex customCodeRegex=新的正则表达式(“{CustomCode}”);
Regex-dateRegex=newregex(“{Date}”);
正则表达式doubleSharpRegex=新正则表达式(“{#+}”);
string customString=“Foo-{{{#}-{Date}-{CustomCode}-{####}”;
string newString=customCodeRegex.Replace(customString,{0});
newString=dateRegex.Replace(newString,{1});
newString=doubleSharpRegex.Replace(newString,
匹配=>
{
字符串zeroPadding=match.Value.Substring(1,match.Value.Length-2);
zeroPadding=zeroPadding.Replace('#','0');
返回“{2:”+zeroPadding+“}”;
});
字符串customCode=“C001”;
字符串日期=DateTime.Today.ToString(“yyyyMMdd”);
string[]generatedCodes=新字符串[3];
对于(int i=0;i
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

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