отримати всіх символів праворуч від останнього тире


114

У мене є таке:

string test = "9586-202-10072"

Як би я -перейшов усіх символів праворуч від фіналу так 10072. Кількість символів завжди різна справа від останнього тире.

Як це можна зробити?

Відповіді:


237

Ви можете отримати позицію останнього за -допомогою str.LastIndexOf('-'). Тож наступний крок очевидний:

var result = str.Substring(str.LastIndexOf('-') + 1);

Виправлення :

Як Брайан заявляє нижче, використання цього на рядку без тире призведе до того, що повернеться та сама струна.


1
Це працює навіть тоді, коли дефіс є останнім символом, і в цьому випадку він правильно повертає порожній рядок. Це не вдасться лише в тому випадку, якщо або strнемає, або якщо він зовсім не містить дефіс. (У випадку, коли дефіса немає, він не кидає; він повертає весь рядок джерела.)
ЛукаХ

@LukeH: Дякую за голову. Я не перевірив і помилково припустив, що це кине.
Джон

3
Ну, LastIndexOfповертається -1, якщо нічого не буде знайдено (це документально підтверджено поведінку, тому на це можна покластися). str.Substring(1-1)дає рядок, рівний str. Тут немає сюрпризів.
Брайан

2
@Brian: Я думаю, що я побив рекорд за більшість помилок у тому ж тривіальному твердженні. Урок: ніколи нічого не пишіть без коректури коду після факту. Дякую.
Джон

57

Ви можете використовувати LINQ і зберегти собі явний аналіз:

string test = "9586-202-10072";
string lastFragment = test.Split('-').Last();

Console.WriteLine(lastFragment);

5
Це, ймовірно, заощадить найвищий час для розробників, але в загальному випадку зауважте, що подібний код матиме багато рядкових розподілів (можливо, чотири у наведеному вище прикладі), тому може бути демефазований у критичних для продуктивності розділах.
Чарльз Бернс


4
YourString.Substring(YourString.LastIndexOf("-"));

4
якщо ви виключаєте "+ 1" в кінці, то вихід буде містити спеціальний символ разом із рядком.
Meena

3

Я бачу, що цю публікацію переглядали понад 46 000 разів. Я б сказав, що багато хто з 46 000 глядачів задають це питання просто тому, що вони просто хочуть назву файлу ... і ці відповіді можуть бути кролячим отвором, якщо ви не можете зробити свою підрядку дослівно, використовуючи знак.

Якщо ви просто хочете отримати ім'я файлу, то тут є проста відповідь, яку слід згадати тут. Навіть якщо це не точна відповідь на питання.

result = Path.GetFileName(fileName);

див. https://msdn.microsoft.com/en-us/library/system.io.path.getfilename(v=vs.110).aspx




1
string atest = "9586-202-10072";
int indexOfHyphen = atest.LastIndexOf("-");

if (indexOfHyphen >= 0)
{
    string contentAfterLastHyphen = atest.Substring(indexOfHyphen + 1);
    Console.WriteLine(contentAfterLastHyphen );
}

0

Я створив розширення для цього рядка, сподіваюся, це допоможе.

public static string GetStringAfterChar(this string value, char substring)
    {
        if (!string.IsNullOrWhiteSpace(value))
        {
            var index = value.LastIndexOf(substring);
            return index > 0 ? value.Substring(index + 1) : value;
        }

        return string.Empty;
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.