wszystkie znaki na prawo od ostatniego myślnika


114

Mam:

string test = "9586-202-10072"

Jak miałbym -umieścić wszystkie znaki na prawo od końcowego, więc 10072. Liczba znaków jest zawsze różna na prawo od ostatniego myślnika.

Jak to zrobić?

Odpowiedzi:


237

Możesz uzyskać pozycję ostatniego za -pomocą str.LastIndexOf('-'). Więc następny krok jest oczywisty:

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

Korekta :

Jak Brian stwierdza poniżej, użycie this na łańcuchu bez myślników spowoduje zwrócenie tego samego ciągu.


1
Działa to nawet wtedy, gdy łącznik jest ostatnim znakiem, w takim przypadku poprawnie zwraca pusty ciąg. To się nie powiedzie tylko wtedy, gdy albo strjest zerowe, albo w ogóle nie zawiera łącznika. (W przypadku, gdy nie ma łącznika, nie rzuca; zwraca cały ciąg źródłowy.)
LukeH

@LukeH: Dzięki za ostrzeżenia. Nie sprawdziłem i błędnie założyłem, że rzuci.
Jon

3
Cóż, LastIndexOfzwraca -1, jeśli nic nie zostanie znalezione (jest to udokumentowane zachowanie, więc można na nim bezpiecznie polegać). str.Substring(1-1)daje ciąg równy str. Bez niespodzianek.
Brian

2
@Brian: Myślę, że pobiłem swój rekord większości błędów w tym samym trywialnym stwierdzeniu. Lekcja: nigdy nie pisz niczego bez korekty kodu po fakcie. Dzięki.
Jon

57

Możesz użyć LINQ i zapisać sobie jawną analizę:

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

Console.WriteLine(lastFragment);

5
Prawdopodobnie zaoszczędzi to najwięcej czasu programisty, ale w ogólnym przypadku należy zauważyć, że taki kod będzie zawierał wiele alokacji ciągów (prawdopodobnie cztery w powyższym przykładzie), więc może być pomniejszony w sekcjach krytycznych dla wydajności.
Charles Burns,

5
string tail = test.Substring(test.LastIndexOf('-') + 1);

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

4
jeśli wykluczysz „+ 1” na końcu, wynik będzie zawierał znak specjalny wraz z ciągiem.
Meena

3

Widzę, że ten post został obejrzany ponad 46 000 razy. Założę się, że wielu z 46 000 widzów zadaje to pytanie po prostu dlatego, że chcą tylko nazwy pliku ... a te odpowiedzi mogą być króliczą dziurą, jeśli nie możesz napisać podciągu dosłownie za pomocą znaku at.

Jeśli chcesz po prostu uzyskać nazwę pliku, istnieje prosta odpowiedź, o której należy tutaj wspomnieć. Nawet jeśli nie jest to dokładna odpowiedź na pytanie.

result = Path.GetFileName(fileName);

zobacz 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

Stworzyłem do tego rozszerzenie ciągu, mam nadzieję, że to pomoże.

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;
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.