2012-06-21 53 views
17

ho una stringa simileC# - Substring: indice e lunghezza devono fare riferimento a una posizione all'interno della stringa

string url = "www.example.com/aaa/bbb.jpg"; 

"www.example.com/" è fissata il 18 di lunghezza. Voglio ottenere il "/ bbb aaa" parte da questa stringa (l'URL reale non è esempio né aaa/bbb però, la lunghezza può variare)

ecco quello che ho fatto:

string newString = url.Substring(18, url.Length - 4); 

Poi Ho ottenuto l'eccezione: l'indice e la lunghezza devono fare riferimento a una posizione all'interno della stringa. Cosa c'è di sbagliato nel mio codice e come risolverlo? Grazie in anticipo.

+2

Gli argomenti della sottostringa sono (startIndex, lunghezza). Non sono sicuro di dove stai ricevendo 18 e Length-4 per la sottostringa che desideri. –

+1

Necessario anche sottrarre il 18 per contabilizzare per l'iniziale "www.xxx.com/" EDIT: Voglio dire, 12.Il tuo 18 dovrebbe essere 12 :) –

+0

Puoi usare la classe System.Uri (http://msdn.microsoft.com/en-us/library/system.uri.aspx) per questo invece? –

risposta

34

Il secondo parametro in Substring è la lunghezza della sottostringa, non l'indice finale.

Probabilmente dovresti includere la gestione per verificare che effettivamente inizi con quello che ti aspetti, terminare con quello che ti aspetti, ed è almeno il tempo che ti aspetti. E se non corrisponde, puoi fare qualcos'altro o lanciare un errore significativo.

Ecco qualche esempio di codice che convalida l'URL contiene le corde, che è anche refactoring un po 'per rendere più facile cambiare il prefisso/suffisso per mettere a nudo:

var prefix = "www.example.com/"; 
var suffix = ".jpg"; 
string url = "www.example.com/aaa/bbb.jpg"; 

if (url.StartsWith(prefix) && url.EndsWith(suffix) && url.Length >= (prefix.Length + suffix.Length)) 
{ 
    string newString = url.Substring(prefix.Length, url.Length - prefix.Length - suffix.Length); 
    Console.WriteLine(newString); 
} 
else 
    //handle invalid state 
+1

Sì, ma Mando vuole scaricare la parte ".jpg". –

+0

Oh, oops, mio ​​errore. Lo aggiusterò. –

+0

url.Length - 22 ??? Come hai ottenuto quel numero? – walther

6

Il tuo errore è i parametri a Substring. Il primo parametro dovrebbe essere l'indice iniziale e il secondo dovrebbe essere la lunghezza o l'offset dall'indice iniziale.

string newString = url.Substring(18, 7); 

Se la lunghezza della sottostringa può variare è necessario calcolare la lunghezza.

Qualcosa in direzione (url.Length - 18) - 4 (o url.Length - 22)

Alla fine sarà simile a questa

string newString = url.Substring(18, url.Length - 22); 
+0

La lunghezza della parte "aaa/bbb" varia di volta in volta, quindi non è esattamente 7. Ma grazie per aver risposto alla mia domanda. upvoted your answer :) – Manto

+0

22 è corretto, perché vuoi conoscere la lunghezza, non l'indice – walther

2

provate questo:

int positionOfJPG=url.IndexOf(".jpg"); 
string newString = url.Substring(18, url.Length - positionOfJPG); 
3

è necessario trovare la posizione del primo /, quindi calcolare la parte desiderata:

2
string newString = url.Substring(18, (url.LastIndexOf(".") - 18)) 
+0

Sì, che funziona. – Manto

0

Ecco un altro suggerimento. Se è possibile anteporre http: // per la stringa URL che si può fare questo

string path = "http://www.example.com/aaa/bbb.jpg"; 
    Uri uri = new Uri(path);    
    string expectedString = 
     uri.PathAndQuery.Remove(uri.PathAndQuery.LastIndexOf(".")); 
5

Che ne dite di qualcosa di simile:

string url = "http://www.example.com/aaa/bbb.jpg"; 
Uri uri = new Uri(url); 
string path_Query = uri.PathAndQuery; 
string extension = Path.GetExtension(path_Query); 

path_Query = path_Query.Replace(extension, string.Empty);// This will remove extension 
+0

Buona soluzione basata unicamente sulle funzioni di libreria anziché l'indicizzazione di stringhe hacky che rende più leggibile e più robusto. –

0

È possibile utilizzare padding a destra.

string url = "www.example.com/aaa/bbb.jpg"; 
string newString=url.PadRight(4); 
string newString = (url.Substring(18, url.Length - 4)).Trim(); 

Felice codifica!

+1

se vuoi rendere il codice più sicuro. Prova a controllare la lunghezza prima di provare a ottenere la sottostringa. –

Problemi correlati