2012-06-21 19 views
17

tengo una cadena que pareceC# - Subcadena: índice y la longitud deben hacer referencia a una ubicación dentro de la cadena

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

"www.example.com/" es el 18 de longitud fija. Quiero conseguir el "bbb aaa /" parte de esta cadena (La url real no es ejemplo ni aaa/bbb embargo, la longitud puede variar)

Así que aquí está lo que hice:

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

Entonces Obtuve la excepción: el índice y la longitud deben hacer referencia a una ubicación dentro de la cadena. ¿Qué pasa con mi código y cómo solucionarlo? Gracias por adelantado.

+2

Los argumentos para la subcadena son (startIndex, length). No estoy seguro de dónde obtendrá 18 y Length-4 de la subcadena que desea. –

+1

También es necesario restar el 18 para dar cuenta de la inicial "www.xxx.com/" EDITAR: Quiero decir, 12.Tu 18 debería ser 12 :) –

+0

¿Puedes usar la clase System.Uri (http://msdn.microsoft.com/en-us/library/system.uri.aspx) para esto? –

Respuesta

34

El segundo parámetro en Substring es la longitud de la subcadena, no el índice final.

Probablemente deberías incluir el control para comprobar que realmente comienza con lo que esperas, terminar con lo que esperas y es al menos tan largo como esperas. Y luego, si no coincide, puede hacer otra cosa o lanzar un error significativo.

Aquí hay un código de ejemplo que valida que la URL contiene las cuerdas, que también se refactorizado un poco para que sea más fácil cambiar el prefijo/sufijo para despojar a:

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í, pero Mando quiere volcar la parte ".jpg". –

+0

Oh, oops, mi error. Lo arreglaré. –

+0

url.Length - 22 ??? ¿Cómo conseguiste ese número? – walther

6

Su error es los parámetros a Subcadena. El primer parámetro debe ser el índice de inicio y el segundo debe ser la longitud o el desplazamiento del índice de inicio.

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

Si la longitud de la subcadena puede variar, necesita calcular la longitud.

Algo en la dirección de (url.Length - 18) - 4 (o url.Length - 22)

Al final se verá algo como esto

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

La longitud de la parte "aaa/bbb" varía de vez en cuando, por lo que no es exactamente 7. Pero gracias por responder mi pregunta. vota tu respuesta :) – Manto

+0

22 es correcto, porque quieres saber la longitud, no el índice – walther

2

Prueba esto:

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

es necesario encontrar la posición del primer /, y luego calcule la porción que desea:

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

Sí que funciona. – Manto

0

Aquí hay otra sugerencia. Si puede anteponer http: // a la cadena de URL que puede hacer esto

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

¿Qué tal algo como esto:

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

Buena solución que depende únicamente de las funciones de la biblioteca en lugar de la indexación de cadenas hacky, lo que la hace más legible y más robusta. –

0

Puede usar relleno derecho.

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

Happy Coding!

+1

si desea que el código sea más seguro. Intente verificar la longitud primero antes de tratar de obtener la subcadena. –

Cuestiones relacionadas