C # – Sottostringa: l’indice e la lunghezza devono fare riferimento a una posizione all’interno della stringa

Ho una stringa che sembra

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

“www.example.com/” è 18 di lunghezza fissa. Voglio ottenere la parte “aaa / bbb” da questa stringa (l’url effettivo non è né esempio né aaa / bbb, la lunghezza può variare)

quindi ecco cosa ho fatto:

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

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

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 un esempio di codice che convalida che l’url contiene le stringhe, che viene anche rifattorizzato un po ‘per facilitare la modifica del prefisso / suffisso su strip:

 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 

Il tuo errore sono i parametri di Sottostringa. 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 nella direzione di (url.Length - 18) - 4 (o url.Length - 22 )

Alla fine assomiglierà a qualcosa del genere

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

Che ne dici di qualcosa del genere :

 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 

Devi trovare la posizione del primo / , quindi calcolare la porzione che desideri:

 string url = "www.example.com/aaa/bbb.jpg"; int Idx = url.IndexOf("/"); string yourValue = url.Substring(Idx + 1, url.Length - Idx - 4); 

Prova questo:

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

Ecco un altro suggerimento. Se puoi anteporre http: // alla tua stringa url puoi farlo

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

È ansible utilizzare il riempimento 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!