2011-05-19 98 views
3

不能完全確定這是可能的,但說我有兩個字符串,像這樣:迭代通過字符串?

"IAmAString-00001" 
"IAmAString-00023" 

這將是一個quick'n'easy方式通過移動了指數從IAmAString-0001進行迭代,以IAmAString-00023只是數字的結尾?

這個問題比這個更普遍一些,例如我可以處理的字符串可以是任何格式,但最後一堆字符總是數字,所以像Super_Confusing-String#w00t0003,在這種情況下最後的0003將是我用來迭代的。

任何想法?

+0

您可以使用字典將字符串與相應的數字索引進行映射。 – 2011-05-19 13:06:53

回答

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

string.Format和for循環應該做你想做的。

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

或類似的東西(不坐在編譯器前面)。

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

如果你可以假設,最後5個字符隨後數:

string prefix = "myprefix-"; 
for (int i=1; i <=23; i++) 
{ 
    Console.WriteLine(myPrefix+i.ToString("D5")); 
} 
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()); 
} 
2

我認爲這將是更好,如果你從上次搜索(裏克已經upvoted你,因爲這是烏拉圭回合的邏輯:-))

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

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並不總是按照您期望的方式來解析字符串。如果有另一種解決方案仍然運行得很快,那麼我寧願選擇這條路線,因爲我更容易理解並知道它可以與任何字符串組合起作用。例如:如果您使用某些其他解決方案,如「I AmAString-000001」,則您將得到「2000001」作爲您的數字而不是「1」。