C# - Substring: l'index et la longueur doivent se référer à un emplacement dans la chaîne

j'ai une chaîne qui ressemble à

string url = "www.example.com/aaa/bbb.jpg";
<!--2 www.example.com / " est de 18 de longueur fixe. Je veux obtenir la partie "AAA / bbb" à partir de cette chaîne (l'url actuelle n'est pas un exemple ni aaa/bbb bien que la longueur puisse varier)

donc voici ce que j'ai fait:

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

puis j'ai eu l'exception: l'index et la longueur doivent se référer à un emplacement dans la chaîne. Quel est le problème avec mon code et comment le résoudre? Merci à l'avance.

20
demandé sur Kenster 2012-06-22 03:25:16

8 réponses

Le second paramètre Substring est la longueur de la sous-couche, pas l'indice de fin.

vous devriez probablement inclure la manipulation pour vérifier qu'elle commence effectivement avec ce que vous attendez, se termine avec ce que vous attendez, et est au moins aussi longtemps que vous attendez. Et si elle ne correspond pas, vous pouvez soit faire quelque chose d'autre ou jeter une erreur significative.

voici un exemple de code qui valide que l'url contient vos chaînes, qui est aussi un peu remanié pour faciliter le changement 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
40
répondu Tim S. 2016-09-04 19:41:26

votre erreur est les paramètres de la soustraction. Le premier paramètre devrait être l'indice de départ et le second devrait être la longueur ou le décalage par rapport à l'indice de départ.

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

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

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

À la fin il va ressembler à quelque chose comme ceci

string newString = url.Substring(18, url.Length - 22);
6
répondu MAV 2012-06-21 23:51:42

Que Diriez-vous de quelque chose comme ceci :

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
répondu HatSoft 2016-09-04 12:32:12

vous devez trouver la position de la première /, et ensuite calculer la portion que vous voulez:

string url = "www.example.com/aaa/bbb.jpg";
int Idx = url.IndexOf("/");
string yourValue = url.Substring(Idx + 1, url.Length - Idx - 4);
4
répondu Ken White 2016-09-04 12:31:54

Essaye Ceci:

 int positionOfJPG=url.IndexOf(".jpg");
 string newString = url.Substring(18, url.Length - positionOfJPG);
2
répondu Bishnu Paudel 2012-06-21 23:36:24
string newString = url.Substring(18, (url.LastIndexOf(".") - 18))
2
répondu Bastardo 2012-06-21 23:44:44

Voici une autre suggestion. Si vous pouvez ajouter http:// à votre chaîne 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
répondu Prashanth Thurairatnam 2016-09-04 12:32:26

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
répondu Pramod Mali 2017-04-13 10:01:22