字符串替换参数

时间:2014-01-04 23:23:22

标签: c# string

(C#)我的代码似乎没问题,但每当我把0作为第二个参数时它就会显示出来 “敌人50”,当我希望敌人57变成敌人00时。我认为第三个if语句存在问题,但不确定是否可以修复它。

主要

   string enemy57 = "enemy57";
   Console.WriteLine("The old image name is: " + enemy57);
   Console.WriteLine("New image name: " + BuildingBlock.NextImageName(enemy57, 0));
   Console.ReadLine();


class BuildingBlock
{
    public static string ReplaceOnce(string word, string characters, int position)
    {
        word = word.Remove(position, characters.Length);
        word = word.Insert(position, characters);
        return word;
    }

    public static string GetLastName(string name)
    {
        string result = "";
        int posn = name.LastIndexOf(' ');
        if (posn >= 0) result = name.Substring(posn + 1);
        return result;
    }

    public static string NextImageName(string filename, int newNumber)
    {

        if (newNumber > 9)
        {
            return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
        }
        if (newNumber < 10)
        {
            return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 1));
        }
        if (newNumber == 0)
        {
            return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
        }
        return filename;
    }

3 个答案:

答案 0 :(得分:2)

这是一个可能会做你想要的例子。

它会:

  1. 用新号码替换所有最终数字
  2. 确保字符串中的新数字与字符串中的原始数字相同(或更多,如果需要)
  3. 意思是:

    Enemy01, replace with 5, will be Enemy05
    Enemy57, replace with 5, will be Enemy05
    Enemy1, replace with 57, will be Enemy57
    

    这是一个LINQPad程序,演示了:

    void Main()
    {
        NextImageName("Enemy01", 5).Dump();
        NextImageName("Enemy57", 5).Dump();
        NextImageName("Enemy5", 57).Dump();
    }
    
    public static string NextImageName(string filename, int newNumber)
    {
        var re = new Regex(@"\d+$");
        return re.Replace(filename, match =>
        {
            return newNumber.ToString().PadLeft(match.Length, '0');
        });
    }
    

    输出:

    Enemy05
    Enemy05
    Enemy57
    

    正则表达式

    \d+$
    

    意味着:

      +- one or more times
      v
    \d+$
    ^^ ^
     | |
     | +-- followed by the end of the string
     |
     digits (0-9)
    

    换句话说:

    • 一个或多个数字(0-9)
    • 后面是字符串
    • 的结尾

答案 1 :(得分:1)

尝试用

替换上次调用ReplaceOnce
 return ReplaceOnce(filename, newNumber.ToString("D2"), (filename.Length - 2));

问题是因为您传递的整数0被转换为字符串“0”,其长度为1个字符。因此,ReplaceOnce方法仅替换保留5的最后一个字符。

使用ToString composite formatting规则D2确保传递给方法的任何数字都将使用至少两个字符进行格式化。

说,看到你测试newNumber == 0你也可以写

 return ReplaceOnce(filename, "00", (filename.Length - 2));

此外,应在测试之前执行零测试。 10否则你用错误的参数调用方法。

public static string NextImageName(string filename, int newNumber)
{

    if (newNumber == 0)
    {
        return ReplaceOnce(filename, "00", (filename.Length - 2));
    }
    if (newNumber > 9)
    {
        return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
    }
    if (newNumber < 10)
    {
        return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 1));
    }
    // Unreachable code ???
    // return filename;
}

如果您确定twh结尾字符总是两位数,并且您想要将当前数字替换为另外两位数,也只替换一位数newNumber,您可以写

public static string NextImageName(string filename, int newNumber)
{
    // ToString("D2") forces the 1-9 range to be passed as 0X no need to test 
    return ReplaceOnce(filename, newNumber.ToString("D2"), (filename.Length - 2));
}

删除所有现在不必要的数字长度测试

答案 2 :(得分:1)

你的代码的问题是最后一个检查0但在你检查&lt;之前的if语句。 10如果newnumber为0将进入。所以它只是切换,如果高于其他2或他们之间像这样:

public static string NextImageName(string filename, int newNumber)
{
    if (newNumber == 0)
    {
        return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
    }
    if (newNumber > 9)
    {
        return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 2));
    }
    if (newNumber < 10)
    {
        return ReplaceOnce(filename, newNumber.ToString(), (filename.Length - 1));
    }
    return filename;
}

或者如果你想作为一个例子,你也可以删除ReplaceOnce方法,并像这样做:

public static string NextImageName(string filename, int newNumber)
{
    if (newNumber == 0)
    {
        return Regex.Replace(filename, @"[\d+]", newNumber.ToString());
    }
    if (newNumber > 9)
    {
        return Regex.Replace(filename, @"(\d+)(?!.*\d)", newNumber.ToString());
    }
    if (newNumber < 10)
    {
        return Regex.Replace(filename, @"(\d)(?!.*\d)", newNumber.ToString());
    }
    return filename;
}