2012-10-17 9 views
9

Jeśli mam następujący ciąg:Shorthand sposób, aby usunąć ostatni ukośnik i znaki końcowe z ciągiem

/Lorem/Ipsum/dolor

i chcę to stać:

/lorem/ipsum

Co jest wa krótki ręki y usuwania ostatniego ukośnika i wszystkich znaków, które go śledzą?

Wiem, jak mogę to zrobić, dzieląc ciąg na List<> i usuwając ostatni element, a następnie dołączając, ale czy istnieje krótszy sposób zapisu tego?

Moje pytanie to , a nie specyficzne adresy URL.

+1

To będzie zależało od tego, jak chcesz obsługiwać adresy URL typu domain.com/ lub domain.com/lorem/ipsum/dolor/ – ZombieSheep

+2

co z 'domain.com/lorem/ipsum? Path = /'? – SLaks

+0

Proszę zignorować fakt, że jest to adres URL. Tam jest inna logika, która chroni te domeny. – Curt

Odpowiedz

30

Można użyć Substring() i LastIndexOf():

str = str.Substring(0, str.LastIndexOf('/')); 

EDIT (sugerowana komentarz)
Aby uniknąć problemów, gdy łańcuch nie może zawierać /, można użyć coś takiego:

int lastSlash = str.LastIndexOf('/'); 
str = (lastSlash > -1) ? str.Substring(0, lastSlash) : str; 

Zapisanie pozycji w zmiennej temp uniemożliwiłoby dwukrotne połączenie się z .LastIndexOf('/'), ale można go zamiast tego zastąpić rozwiązaniem jednoliniowym.

+2

Będziesz chciał sprawdzić, czy 'LastIndexOf' nie zwrócił -1 przed użyciem wyniku, czy też _BANG! _ –

+0

@GrantThomas Dzięki za notatkę; Dodałem zalecaną przeze mnie aktualizację do mojej odpowiedzi, aby powiadomić o tym. – newfurniturey

+0

@newfurniturey Dzięki! Działa jak smakołyk. Tak, że mogę włączyć to wszystko w tę samą linię (bez potrzeby użycia obiektu 'lastSlash': string.Contains ("/")? [Twoja logika]: null'. (Jestem szczęśliwy dla null, który ma zostać zwrócony, jeśli nie ma żadnych ukośników) Ponownie na szczęście – Curt

7

Możesz zrobić coś takiego jak str.Remove(str.LastIndexOf("/")), ale nie ma wbudowanej metody robienia tego, co chcesz.

Edycja: można również używać obiektu Uri przemierzać katalogi, choć nie daje dokładnie to, co chcesz:

Uri baseUri = new Uri("http://domain.com/lorem/ipsum/dolor"); 
Uri myUri = new Uri(baseUri, "."); 
// myUri now contains http://domain.com/lorem/ipsum/ 
2

Można użyć wyrażenia regularnego /[^/]*$ i zastąpić pustym ciągiem:

var fixed = new Regex("/[^/]*$").Replace("domain.com/lorem/ipsum/dolor", "") 

Ale to chyba przesada tutaj. Odpowiedź @ newfurniturey na Substring z LastIndexOf jest prawdopodobnie najlepsza.

3

Prostym sposobem byłoby

String s = "domain.com/lorem/ipsum/dolor"; 
    s = s.Substring(0, s.LastIndexOf('/')); 
    Console.WriteLine(s); 

Innym może

String s = "domain.com/lorem/ipsum/dolor"; 
s = s.TrimEnd('/'); 
Console.WriteLine(s); 
+0

TrimEnd nie działa, usunie "/" na końcu, ale nie usunie tekstu po ostatnim pojawieniu się. – Chris

0
 while (input.Last() == '/' || input.Last() == '\\') 
     { 
      input = input.Substring(0, input.Length - 1); 
     } 
+0

Podczas gdy ten kod może odpowiedzieć pytanie, byłoby lepiej włączyć jakiś kontekst, wyjaśnić, jak to działa i opisać, kiedy go używać. Odpowiedzi tylko na kod nie są przydatne na dłuższą metę. – ryanyuyu

2

Lubię tworzyć rozszerzeniem ciąg dla rzeczy tak:

/// <summary> 
/// Returns with suffix removed, if present 
/// </summary> 
public static string TrimIfEndsWith(
    this string value, 
    string suffix) 
{ 
    return 
     value.EndsWith(suffix) ? 
      value.Substring(0, value.Length - suffix.Length) : 
      value; 
} 

Następnie można użyj w ten sposób:

var myString = "/lorem/ipsum/dolor"; 
myStringClean = myString.TrimIfEndsWith("/dolor"); 

Masz teraz rozszerzenie wielokrotnego użytku we wszystkich swoich projektach, które może być użyte do usunięcia jednego znaku końcowego lub wielokrotnego.

4

Jeśli na końcu adresu URL znajduje się znak "/", usuń go. Jeśli nie; po prostu zwróć oryginalny.

var url = this.Request.RequestUri.ToString(); 
url = url.EndsWith("/") ? url.Substring(0, url.Length - 1) : url; 
url += @"/mycontroller"; 
0

Dziękuję @Curt za pytanie. Ja nieznacznie poprawiłem kod @ newfurniturey, a oto moja wersja.

if(str.Contains('/')){ 
     str = str.Substring(0, str.LastIndexOf('/')); 
} 
Powiązane problemy