循环访问字符串

本文关键字:字符串 访问 循环 | 更新日期: 2023-09-27 17:56:51

不完全确定这是可能的,但假设我有两个这样的字符串:

"IAmAString-00001"
"IAmAString-00023"

通过向上移动末尾数字的索引,从 IAmAString-0001 迭代到 IAmAString-00023 的快速简便方法是什么?

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

有什么想法吗?

循环访问字符串

您可以使用

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

字符串。格式和 for 循环应该做你想要的。

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

或接近那个的东西(不要坐在编译器前面)。

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));

您可以使用正则表达式:

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);
}

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

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

此函数将查找尾随数字。

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());
}

我认为如果你从最后一个开始搜索会更好(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();
    }

如果最后 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 并不总是按照您期望的方式解析字符串。 如果有替代解决方案仍然可以快速运行,那么我宁愿走这条路,因为它对我来说更容易理解并知道它将适用于任何字符串组合。

例如:如果您使用此处介绍的其他一些解决方案,并带有"I2AmAString-000001"之类的字符串,那么您将得到"2000001"作为您的数字而不是"1"。