2010-01-28 16 views
12

Ok ho una stringa dove voglio rimuovere l'ultima parola raggruppati per \rimuovere ultima parola in etichetta divisa da

ad esempio:

string name ="kak\kdk\dd\ddew\cxz\" 

ora voglio rimuovere l'ultima parola in modo che ho un nuovo valore per nome come

name = "kak \ KDK \ dd \ ddew \"

c'è un modo semplice per fare questo

grazie

risposta

23

Come si ottiene questa stringa in primo luogo? Presumo che tu sappia che '\' è il carattere di escape in C#. Tuttavia, si dovrebbe ottenere molto utilizzando la sostituzione

name = name.TrimEnd('\\') 
name = name.Remove(name.LastIndexOf('\\') + 1); 
+0

Questo non rimuoverà solo l'ultimo \ e non cxz \? – dtb

+0

Questo in realtà rimuoverebbe solo il trailing \ –

+0

Pretty close. Per ottenere la stringa esatta che desidera, è necessario: name = name.TrimEnd ('\\'); nome = nome.Rimuovi (nome.LastIndexOf ('\\') + 1)) – ConsultUtah

5
string result = string.Join("\\", 
      "kak\\kdk\\dd\\ddew\\cxz\\" 
      .Split(new[] { '\\' }, StringSplitOptions.RemoveEmptyEntries) 
      .Reverse() 
      .Skip(1) 
      .Reverse() 
      .ToArray()) + "\\"; 
+2

Oh caro! Stai scherzando? –

+2

Certo, un po '. Ma è ovviamente corretto, non è vero? Non scherzo con gli indici nella stringa, o enigmi criptici, ecc. – dtb

+2

Trovo spaventoso che tu sia in grado di venire con quella soluzione ... ;-) – ConsultUtah

0

Questa espressione regolare dovrebbe fare il trucco:

name = Regex.Replace(name, @"\\[a-z]*\\$", "\\"); 
1

Ecco un modo non regex di farlo.

string newstring = name.SubString(0, name.SubString(0, name.length - 1).LastIndexOf('\\')); 
1

Prova questo:

const string separator = "\\"; 
string name = @"kak\kdk\dd\ddew\cxz\"; 
string[] names = name.Split(separator.ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries); 
string result = String.Join(separator, names, 0, names.Length - 1) + separator; 
1

EDIT: Ho appena notato che name.Substring(0,x) è equivalente a name.Remove(x), così ho cambiato la mia risposta a riflettere sul fatto che.

In una sola riga:

name = name = name.Remove(name.Remove(name.Length - 1).LastIndexOf('\\') + 1); 


Se si vuole capire, ecco come potrebbe essere scritto (eccessivamente) verbosely:

string nameWithoutLastSlash = name.Remove(name.Length - 1); 
int positionOfNewLastSlash = nameWithoutLastSlash.LastIndexOf('\\') + 1; 
string desiredSubstringOfName = name.Remove(positionOfNewLastSlash); 
name = desiredSubstringOfName; 
+0

Grazie amico ..Ho provato anche questo e questo funziona anche .. – user175084

0
string name ="kak\kdk\dd\ddew\cxz\" 
string newstr = name.TrimEnd(@"\") 
+0

Anche se si aggiunge punto e virgola, che non compila (o funziona). TrimEnd accetta "params char []", non una stringa. E se hai riparato l'argomento, il risultato sarebbe "kak \ kdk \ dd \ ddew \ cxz", che non è quello che l'OP vuole. – JeffH

0

mia soluzione

public static string RemoveLastWords(this string input, int numberOfLastWordsToBeRemoved, char delimitter) 
     { 
      string[] words = input.Split(new[] { delimitter }); 
      words = words.Reverse().ToArray(); 
      words = words.Skip(numberOfLastWordsToBeRemoved).ToArray(); 
      words = words.Reverse().ToArray(); 
      string output = String.Join(delimitter.ToString(), words); 
      return output; 
     } 

Functio n chiama

RemoveLastWords("kak\kdk\dd\ddew\cxz\", 1, '\') 
Problemi correlati