2014-02-06 38 views
1

我想將數字追加到名稱。結果應該看起來像name-1,name-2,name-3將數字追加到名稱(字符串)

問題是,名稱可能已經有一個破折號和號碼的數量。在這種情況下,我希望數字被增加,而不是另一個數字被追加。這用於複製功能。

另一個問題是,名稱可能包含破折號,所以我不能使用string.split 有沒有一個聰明的方法來做到這一點。也許與正則表達式?

private string generateName(string name, int count) 
{ 
    string.Format("{0}-{1}",name,count); 
} 

示例: 輸入=>輸出繼電器

名=>名-1

名稱-1 =>名稱-2

名稱-AB =>名稱-AB-1

+0

您可能正在尋找一個正則表達式解決方案,該解決方案匹配字符串結尾處的數字,後面跟着一個'-' – Shiva

+0

或者只是幾個if語句... – niemiro

+0

如果您展示了一些示例輸入,和你所期望的輸出。 –

回答

2

試試這個:

Match match = Regex.Match(name, @"^(.*)-([0-9]+)$", RegexOptions.IgnoreCase); 
if (match.Success) 
{ 
     return string.Format("{0}-{1}",match.Groups[1].Value, match.Groups[2].Value+ 1); 
} else { 
     return string.Format("{0}-{1}",name,count); 
    } 
+0

降低代碼數(如果您喜歡較少的代碼)的一個好方法是擺脫oldnum,只是做 string.Format(「{0} - {1}」,name,match .Groups [1] .Value + 1); –

+0

你將有編譯時錯誤,你試圖編譯這個,你正在返回值爲字符串! –

+0

你也混合了你的一些變量。你在'Regex.Match'的調用中使用'input',而在'string.Format'調用中使用'name'。 –

1

如果你不想使用正則表達式(有人發佈了一個可愛的答案),你可以這樣做:

private string generateName(string name, int count) 
{ 
    // Find last dash 
    int dashPos = name.LastIndexOf("-"); 
    if (dashPos == 0) return string.Format("{0}-{1}",name,count); 

    // Extract content after last dash 
    string lastEl = name.SubString(dashPos+1); 
    int lastNumber; 

    // Check if it is a number 
    bool isNumber = int32.TryParse(lastEl, out lastNumber) 
    if (isNumber){ 
     return string.Format("{0}-{1}", name.SubString(0, dashPos), ++lastNumber); 
    } 

    return string.Format("{0}-{1}", name, count); 
} 
+0

或使用Niels的解決方案 – Ruskin

+1

您需要使用前綴增量運算符才能使解決方案正常工作。目前,'lastNumber ++'首先檢索'lastNumber',並在'string.Format'調用中使用它。然後它增加'lastNumber'。因此,任何名稱以數字結尾的情況都會導致返回相同的數字。例如,當給出「名稱-1」時,您的解決方案會生成「名稱-1」。 –

+0

乾杯喬恩,固定。我沒有遇到_pre_fix增量運算符++ lastNumber。謝謝。 – Ruskin

0

一個非常簡單的方法來做到這

string d = "asd-a-151532"; 
    int i = d.LastIndexOf('-'); 
    string t = d.Substring(i + 1, d.Length - i - 1); 
    var n = int.Parse(t) + 1; 
    d = d.Substring(0, i + 1) + n.ToString(); 

    Console.WriteLine(t); 
    Console.WriteLine(d); 
+0

您的解決方案不考慮任何名稱不包含短劃線,或者以短劃線結尾,後跟非數字的情況。在這兩種情況下,它都會拋出一個異常(第一個,由於'i'爲無效索引:-1;第二個由於't'不是整數)。另外,您應該使用更多描述性變量名稱,以使您的代碼更易於遵循。 –

+0

這些案例在問題中從未提及,如果是的話,我會寫一些額外的代碼來處理這種情況,我也提供了一個解決方案,而不是複製粘貼代碼,它是一個非常簡單的問題,非常簡單解決方案,所以不需要額外的寫作,如果有不明顯的地方,我會提供額外的解釋,謝謝 –

+0

這兩種情況實際上都明確列在問題中。第一種情況(不是短劃線)是問題本身的一部分。第二種情況(破折號爲非數字)是列出的示例輸入之一。 –

1

很簡單,因爲你說不能用string.Split ...

您可以使用拆分方法。如果你的名字不包含' - ',那麼split將返回一個包含單個字符串的數組。如果結果數組包含多個字符串,則只需檢查最後一個是否是數字。

private string generateName(string name) 
{ 
    var parts = name.Split('-'); 
    int lastPart = parts.Length - 1; 
    // If we have more than one part, then we have a '-' in our name 
    if(lastPart > 0) 
    { 
     int count; 
     // If the last "part" is a number, just increment it 
     if(int.TryParse(parts[lastPart], out count)) 
     { 
      count++; // increment counter 
      parts[lastPart] = count.ToString(); 
      return string.Join("-", parts); 
     } 
    } 
    // If we got here, then our string didn't end with a "-" followed by a number; 
    // just append "-1" to the end. 
    return name + "-1"; 
} 

使用您的示例值,這會產生正確的輸出。此外,這也可以處理,你有多個號碼,在末端的情況:

╔══════════╦═══════════╗ 
║ Input ║ Output ║ 
╠══════════╬═══════════╣ 
║ name  ║ name-1 ║ 
║ name-1 ║ name-2 ║ 
║ name-AB ║ name-AB-1 ║ 
║ name-1-2 ║ name-1-3 ║ 
╚══════════╩═══════════╝ 
0

這種模式應該工作:

@"(\w+(-([^-0-9])+)*)" 

的第一個值將是名字,第二個值,如果有的話。 它應該工作到具有多個' - '字符的點。它對空字符不起作用。