web-dev-qa-db-fra.com

C # - Sous-chaîne: index et length doivent faire référence à un emplacement dans la chaîne

J'ai une ficelle qui ressemble 

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

"www.example.com/" a une longueur fixe de 18 ans. Je veux obtenir la partie "aaa/bbb" de cette chaîne (l'URL réelle n'est pas un exemple, ni aaa/bbb, la longueur peut varier)

alors voici ce que j'ai fait:

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

Ensuite, j'ai eu l'exception: index et length doivent faire référence à un emplacement dans la chaîne. Quel est le problème avec mon code et comment y remédier? Merci d'avance.

21
Manto

Le deuxième paramètre dans Substring est la longueur de la sous-chaîne, pas l'index de fin.

Vous devez probablement inclure le traitement pour vérifier que cela commence bien avec ce que vous attendez, se termine avec ce que vous attendez et au moins aussi longtemps que vous le souhaitez. Et si cela ne correspond pas, vous pouvez soit faire autre chose, soit lancer une erreur significative.

Voici un exemple de code qui valide que l'URL contient vos chaînes, qui est également refactorisé pour faciliter la modification du préfixe/suffixe en 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
43
Tim S.

Votre erreur est les paramètres de sous-chaîne. Le premier paramètre doit être l'index de départ et le second, la longueur ou le décalage par rapport à l'index de départ.

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

Si la longueur de la sous-chaîne peut varier, vous devez en calculer la longueur.

Quelque chose dans la direction de (url.Length - 18) - 4 (ou url.Length - 22

À la fin, cela ressemblera à quelque chose comme ça

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

Que diriez-vous quelque chose comme ça :

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
5
HatSoft

Vous devez trouver la position du premier /, puis calculer la portion souhaitée:

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

Essaye ça:

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

Vous pouvez utiliser le rembourrage à droite.

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

Bon codage!

0
Pramod Mali

Voici une autre suggestion. Si vous pouvez ajouter http: // à votre chaîne d'URL, vous pouvez le faire.

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