2014-02-06 2 views
1

Я хочу добавить номер к имени. Результат должен выглядеть так: name-1, name-2, name-3 и т. Д.Добавить номер к имени (строка)

Проблема заключается в том, что имя может иметь уже цифру и номер в номере. В этом случае я хочу, чтобы число увеличивалось, а не добавлялось еще одно число. Это используется для функции копирования.

Другая проблема заключается в том, что имя может содержать тире, поэтому я не могу использовать string.split , есть ли разумный способ сделать это. Может быть, с регулярным выражением?

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

Пример: вход => Ouput

имя => имя-1

имя-1 => имя-2

имя-АВ => имя-АВ-1

+0

Возможно, вы смотрите на решение 'Regex', которое соответствует строке, заканчивающейся номером, предшествующим значению' -' – 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

Вы также смешали некоторые из ваших переменных. Вы используете 'input' в своем вызове' Regex.Match', но 'name' в ваших вызовах' string.Format'. –

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

Cheers Jon, исправлено. Я не сталкивался с приращением _pre_fix operator ++ 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])+)*)" 

первое значение будет название, второе значение, если есть число. Он должен работать до точки с несколькими символами «-». он ничего не делает с пустыми символами.

Смежные вопросы