C # – Substring: index e length devem referir-se a um local dentro da string

Eu tenho uma string que parece

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

“www.example.com/” tem 18 de comprimento fixo. Eu quero pegar a parte “aaa / bbb” desta string (A url atual não é exemplo nem aaa / bbb, o tamanho pode variar)

então aqui está o que eu fiz:

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

Então eu peguei a exceção: index e length devem se referir a um local dentro da string. O que há de errado com meu código e como corrigi-lo? Desde já, obrigado.

O segundo parâmetro em Substring é o comprimento da subseqüência, não o índice final.

Provavelmente, você deve include o manuseio para verificar se ele realmente começa com o que você espera, terminar com o que você espera e é pelo menos o tempo que você espera. E se não corresponder, você pode fazer outra coisa ou gerar um erro significativo.

Aqui está um exemplo de código que valida que o url contém suas strings, que também é refatorado um pouco para facilitar a alteração do prefixo / sufixo para 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 

Seu erro é os parâmetros para Substring. O primeiro parâmetro deve ser o índice inicial e o segundo deve ser o comprimento ou deslocamento do índice inicial.

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

Se o comprimento da substring puder variar, você precisará calcular o comprimento.

Algo na direção de (url.Length - 18) - 4 (ou url.Length - 22 )

No final, será algo parecido com isto

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

Que tal algo como isso :

 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 

Você precisa encontrar a posição do primeiro / e, em seguida, calcular a parte desejada:

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

Tente isto:

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

Aqui está outra sugestão. Se você pode preceder http: // para sua string de URL, você pode fazer isso

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

Você pode usar o preenchimento certo.

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

Codificação Feliz!