поставить все символы справа от последнего тире


114

Имею следующее:

string test = "9586-202-10072"

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

Как это может быть сделано?

Ответы:


237

Вы можете получить позицию последнего -с помощью str.LastIndexOf('-'). Итак, следующий шаг очевиден:

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

Исправление :

Как говорит Брайан ниже, использование этого параметра в строке без тире приведет к возврату той же строки.


1
Это работает, даже если дефис является последним символом, в этом случае он правильно возвращает пустую строку. Это не сработает, только если оно strравно нулю или вообще не содержит дефиса. (В случае, если дефиса нет, он не бросает; он возвращает всю исходную строку.)
— LukeH

@LukeH: Спасибо за внимание. Я не проверял и ошибочно предположил, что бросит.
— Джон

3
Что ж, LastIndexOfвозвращает -1, если ничего не найдено (это задокументированное поведение, поэтому на него можно положиться). str.Substring(1-1)дает вам строку, равную str. Здесь никаких сюрпризов.
— Брайан

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

58

Вы можете использовать LINQ и избавиться от явного синтаксического анализа:

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

Console.WriteLine(lastFragment);

5
Это, вероятно, сэкономит большую часть времени разработчика, но в общем случае обратите внимание, что в таком коде будет много выделений строк (вероятно, четыре в приведенном выше примере), поэтому в разделах, критичных к производительности, можно не уделять внимания.
— Чарльз Бернс,


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

4
если вы исключите «+ 1» в конце, то вывод будет содержать специальный символ вместе со строкой.
— Мина

3

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

Если вы просто хотите получить имя файла, то здесь следует указать простой ответ. Даже если это не точный ответ на вопрос.

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.