tüm karakterleri son tirenin sağına getir


114

Aşağıdakilere sahibim:

string test = "9586-202-10072"

Tüm karakterleri finalin sağına nasıl -getiririm yani 10072. Karakter sayısı her zaman son tirenin sağından farklıdır.

Bu nasıl yapılabilir?

Yanıtlar:


237

Geçen konumunu elde edebilirsiniz -ile str.LastIndexOf('-'). Yani bir sonraki adım açıktır:

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

Düzeltme :

Brian'ın aşağıda belirttiği gibi, bunu tire içermeyen bir dizede kullanmak aynı dizenin döndürülmesiyle sonuçlanacaktır.


1
Bu, tire son karakter olduğunda bile çalışır, bu durumda doğru bir şekilde boş bir dize döndürür. Bu, yalnızca boşsa strveya hiç tire içermiyorsa başarısız olur . (Kısa çizginin olmadığı durumda atmaz; tüm kaynak dizesini döndürür.)
LukeH

@LukeH: Uyarılar için teşekkürler. Kontrol etmedim ve yanlışlıkla fırlatacağını varsaydım.
Jon

3
Eh, LastIndexOfhiçbir şey bulunmazsa -1 döndürür (bu belgelenmiş bir davranıştır, bu yüzden ona güvenmek güvenlidir). str.Substring(1-1)size eşit bir dize verir str. Burada sürpriz yok.
Brian

2
@Brian: Sanırım aynı önemsiz ifadede çoğu hata için rekorumu kırdım. Ders: gerçeğin ardından kodu yeniden okumadan hiçbir şey yazmayın. Teşekkürler.
Jon

57

LINQ kullanabilir ve açık ayrıştırmadan kendinizi kurtarabilirsiniz:

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

Console.WriteLine(lastFragment);

5
Bu muhtemelen geliştiricilere en fazla zaman kazandıracaktır, ancak genel durumda, bunun gibi bir kodun çok sayıda dize tahsisi olacağına (yukarıdaki örnekte muhtemelen dört), dolayısıyla performans açısından kritik bölümlerde vurgulanmayabileceğine dikkat edin.
Charles Burns

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

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

4
sonunda "+ 1" i hariç tutarsanız, çıktı dizeyle birlikte özel karakter içerecektir.
Meena

3

Bu gönderinin 46.000'den fazla kez görüntülendiğini görebiliyorum. Bahse girerim 46.000 izleyicinin çoğu bu soruyu sadece dosya adını istedikleri için soruyorlar ... ve eğer alt dizenizi at işaretini kullanarak kelimesi kelimesine yapamazsanız, bu cevaplar bir tavşan deliği olabilir.

Sadece dosya adını almak istiyorsanız, burada belirtilmesi gereken basit bir cevap var. Sorunun kesin cevabı olmasa bile.

result = Path.GetFileName(fileName);

bkz. 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

Bunun için bir dize uzantısı oluşturdum, umarım yardımcı olur.

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;
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.