2011-01-05 13 views
19

mój ciąg jest tak:Extract ostatnie słowo z łańcucha przy użyciu C#

string input = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; 

Tutaj rzeczywiście chcę wyodrębnić ostatnie słowo, 'API i powrotu.

Jaki byłby kod C# do wykonania powyższego ekstrakcji?

+0

to „strip” to słowo, czy jest to pierwsze słowo „pasmo”? –

+0

Jaki jest twój wzór? Ostatnie 3 litery? ostatnia rzecz pojawiła się po +? ostatnia rzecz pojawia się po ostatnim operatorze? – xandy

Odpowiedz

51

Cóż, naiwny, że realizacja celu byłoby po prostu podzielone na każdej przestrzeni i wziąć ostatni element.

Podział jest przeprowadzany za pomocą metody instancji na obiekcie String, a ostatni element może być pobrany przy użyciu indeksowania tablicowego lub przy użyciu operatora LINQ Last.

Wynik końcowy:

string lastWord = input.Split(' ').Last(); 

Jeśli nie masz LINQ, chciałbym zrobić to w dwóch operacji:

string[] parts = input.Split(' '); 
string lastWord = parts[parts.Length - 1]; 

ile to będzie działać na tym ciągu, nie może pracować dla nieco inny ciąg, więc albo będziesz musiał wymyślić, jak zmienić kod odpowiednio, albo opublikować wszystkie reguły.

string input = ".... ,API"; 

Tutaj przecinek byłby częścią "słowa".

Ponadto, jeśli pierwsza metoda uzyskiwania słowo jest poprawne, czyli wszystko po ostatniej przestrzeni, a ciąg przestrzega następujących zasad:

  • zawsze będzie zawierać co najmniej jedno miejsce
  • nie kończy się z jednego lub większej liczby miejsc (w przypadku tego można go przycinać)

Następnie można użyć tego kodu, który będzie przeznaczyć mniej obiektów na stercie dla GC martwić później:

string lastWord = input.Substring(input.LastIndexOf(' ') + 1); 

Jednakże, jeśli trzeba wziąć pod uwagę przecinki, średniki i inne, pierwsza metoda z dzieleniem jest najlepsza; jest mniej rzeczy do zapamiętania.

+0

'Substring (input.LastIndexOf ('') + 1) 'jest z pewnością najlepszym wyborem dla wydajności, dlaczego ktokolwiek na ziemi podzieliłby cały ciąg, aby uzyskać ostatnie słowo ??? I BTW, ** jesteś w błędzie ** o brakujących znakach; podłańcuch zwróci ostatni indeks "" lub ostatni indeks całego łańcucha, co oznacza ten sam wynik. Sprawdź to sam: http://rextester.com/IFEGJ69776 – Shimmy

+1

@Shimmy '.LastIndexOf' nie zwraca" ostatniego indeksu całego łańcucha "(co byłoby faktycznie' 0'), jeśli nie może znaleźć dopasowania ciągu, to zwraca '-1', co oczywiście staje się' 0' przy dodawaniu '1', co powoduje, że dostajesz cały ciąg w tym przypadku. –

+0

Sprawdź ten link, testuję pusty ciąg i daje ten sam wynik. [Sprawdź to] (http://rextester.com/CXJYN16822). – Shimmy

10

pierwsze:

using System.Linq; // System.Core.dll 

następnie

string last = input.Split(' ').LastOrDefault(); 

// or 

string last = input.Trim().Split(' ').LastOrDefault(); 

// or 

string last = input.Trim().Split(' ').LastOrDefault().Trim(); 
+0

co jeśli po ostatnim słowie, jeśli ma jakieś miejsce takie jak "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; – Pradeep

+0

@Pradeep: Zaktualizowałem swój post – abatishchev

+0

Nie mogę używać Last(), mówi on, że system.array nie zawiera definicji Last. Moja klasa implementuje interfejs, myślę, że to jest powód, dla którego nie mogę używać last(), więc proszę, powiedz mi jak z niego korzystać – Pradeep

6

var last = input.Substring(input.LastIndexOf(' ')).TrimStart();

Ta metoda nie przeznaczyć cały szereg strun jak inni.

+0

Czy potrzebujesz +1 do LastIndexOf()? A może źle zrobiłem odpowiedź? :) –

+0

@El Ronnoco Tak, ale twoja odpowiedź nie powiedzie się, jeśli ciąg kończy się spacją. (indeks poza końcem łańcucha = wyjątek). TrimStart jest bezpieczniejszy. :) –

+0

Err, oops. Mam tego nie tak. Awaria mózgu. –

0
string input = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; 
var a = input.Split(' '); 
Console.WriteLine(a[a.Length-1]); 
2
string workingInput = input.Trim(); 
string last = workingInput.Substring(workingInput.LastIndexOf(' ')).Trim(); 

Chociaż może to nie powieść, jeśli nie masz żadnych spacji w ciągu.Myślę, że niepotrzebnie intensywne dzielenie się tylko do jednego słowa :)

1
var lastWord = input.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Last(); 
1
static class Extensions 
{ 
    private static readonly char[] DefaultDelimeters = new char[]{' ', '.'}; 

    public string LastWord(this string StringValue) 
    { 
     return LastWord(StringValue, DefaultDelimeters); 
    } 

    public string LastWord(this string StringValue, char[] Delimeters) 
    { 
     int index = StringValue.LastIndexOfAny(Delimeters); 

     if(index>-1) 
      return StringValue.Substring(index); 
     else 
      return null; 
    } 
} 

class Application 
{ 
    public void DoWork() 
    { 
     string sentence = "STRIP, HR 3/16 X 1 1/2 X 1 5/8 + API"; 
     string lastWord = sentence.LastWord(); 
    } 
} 
Powiązane problemy