通过字符串迭代?

时间:2011-05-19 13:00:09

标签: c# string

不完全确定这是可能的,但是我说有两个字符串如下:

"IAmAString-00001"
"IAmAString-00023"

通过向上移动最终数字的索引,从IAmAString-0001迭代到IAmAString-00023会有什么快速的方法?

问题比这更普遍,例如我可以处理的字符串可以是任何格式,但最后一串字符将始终是数字,所以类似于Super_Confusing-String#w00t0003,在这种情况下最后的0003将是我用来迭代的东西。

有什么想法吗?

8 个答案:

答案 0 :(得分:6)

string.Format和for循环应该做你想要的。

for(int i = 0; i <=23; i++)
{
    string.Format("IAmAString-{0:D4}",i);
}

或接近它的东西(不在编译器前面)。

答案 1 :(得分:6)

您可以使用char.IsDigit

    static void Main(string[] args)
    {
        var s = "IAmAString-00001";
        int index = -1;
        for (int i = 0; i < s.Length; i++)
        {
            if (char.IsDigit(s[i]))
            {
                index = i;
                break;
            }
        }
        if (index == -1)
            Console.WriteLine("digits not found");
        else
            Console.WriteLine("digits: {0}", s.Substring(index));
    }

产生这个输出:

digits: 00001

答案 2 :(得分:3)

您可以使用正则表达式:

var match=Regex.Match("Super_Confusing-String#w00t0003",@"(?<=(^.*\D)|^)\d+$");
if(match.Success)
{
    var val=int.Parse(match.Value);
    Console.WriteLine(val);
}

要更具体地回答,您可以使用命名组来提取所需内容:

var match=Regex.Match(
    "Super_Confusing-String#w00t0003",
    @"(?<prefix>(^.*\D)|^)(?<digits>\d+)$");

if(match.Success)
{
    var prefix=match.Groups["prefix"].Value;
    Console.WriteLine(prefix);
    var val=int.Parse(match.Groups["digits"].Value);
    Console.WriteLine(val);
}

答案 3 :(得分:3)

string start = "IAmAString-00001";
string end = "IAmAString-00023";

// match constant part and ending digits
var matchstart = Regex.Match(start,@"^(.*?)(\d+)$");
int numberstart = int.Parse(matchstart.Groups[2].Value);

var matchend = Regex.Match(end,@"^(.*?)(\d+)$");
int numberend = int.Parse(matchend.Groups[2].Value);

// constant parts must be the same
if (matchstart.Groups[1].Value != matchend.Groups[1].Value)
    throw new ArgumentException("");

// create a format string with same number of digits as original
string format = new string('0', matchstart.Groups[2].Length);

for (int ii = numberstart; ii <= numberend; ++ii)
    Console.WriteLine(matchstart.Groups[1].Value + ii.ToString(format));

答案 4 :(得分:2)

如果你可以假设最后5个字符是数字,那么:

string prefix = "myprefix-";
for (int i=1; i <=23; i++)
{
  Console.WriteLine(myPrefix+i.ToString("D5"));
}

答案 5 :(得分:2)

此功能将找到结尾编号。

private int FindTrailingNumber(string str)
{
    string numString = "";
    int numTest;
    for (int i = str.Length - 1; i > 0; i--)
    {
        char c = str[i];
        if (int.TryParse(c.ToString(), out numTest))
        {
            numString = c + numString;
        }
    }
    return int.Parse(numString);
}

假设所有基本字符串都相同,则会在字符串之间进行迭代。

string s1 = "asdf123";
string s2 = "asdf127";
int num1 = FindTrailingNumber(s1);
int num2 = FindTrailingNumber(s2);

string strBase = s1.Replace(num1.ToString(), "");

for (int i = num1; i <= num2; i++)
{
    Console.WriteLine(strBase + i.ToString());
}

答案 6 :(得分:2)

我认为如果你从最后一次搜索会更好(Rick已经赞成你,因为它是你的逻辑: - ))

static void Main(string[] args)
    {
        var s = "IAmAString-00001";
        int index = -1;
        for (int i = s.Length - 1; i >=0; i--)
        {
            if (!char.IsDigit(s[i]))
            {
                index = i;
                break;
            }
        }
        if (index == -1)
            Console.WriteLine("digits not found");
        else
            Console.WriteLine("digits: {0}", s.Substring(index));
        Console.ReadKey();
    }

HTH

答案 7 :(得分:2)

如果最后的X数字始终为数字,则:

int x = 5;
string s = "IAmAString-00001";
int num = int.Parse(s.Substring(s.Length - x, x));
Console.WriteLine("Your Number is: {0}", num);

如果最后的数字长度为3个,4个或5个,那么您需要更多的逻辑:

int x = 0;
string s = "IAmAString-00001";
foreach (char c in s.Reverse())//Use Reverse() so you start with digits only.
{
    if(char.IsDigit(c) == false)
        break;//If we start hitting non-digit characters, then exit the loop.
    ++x;
}
int num = int.Parse(s.Substring(s.Length - x, x));
Console.WriteLine("Your Number is: {0}", num);

我对复杂的RegEx并不擅长。因此,当不需要最大限度的优化时,我总是回避它。原因是RegEx并不总是按照您期望的方式解析字符串。如果有替代解决方案仍然可以快速运行,那么我宁愿走那条路,因为我更容易理解并知道它可以使用任何字符串组合。

例如:如果您使用此处显示的某些其他解决方案,并使用“I 2 AmAString-000001”等字符串,那么您将获得“2000001”作为您的号码而不是“1”