2012-06-21 13 views
17

Mam ciąg znaków, który wygląda jakC# - podciągu: indeks i długość musi odnosić się do lokalizacji w obrębie łańcucha

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

„www.example.com/” jest 18 stałych długości. Chcę uzyskać „AAA/BBB” część z tego łańcucha (Rzeczywista URL nie jest przykładem ani aaa/bbb chociaż długość może się różnić)

Więc oto co zrobiłem:

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

Następnie Dostałem wyjątek: indeks i długość muszą odnosić się do lokalizacji w ciągu znaków. Co jest nie tak z moim kodem i jak to naprawić? Z góry dziękuję.

+2

Argumentami dla podłańcucha są (startIndex, długość). Nie wiem, skąd bierzesz 18 i Długość-4 od podłańcucha, który chcesz. –

+1

Należy również odjąć 18, aby uwzględnić początkowe "www.xxx.com/". EDYCJA: To znaczy, 12.Twoje 18 powinno być 12 :) –

+0

Czy możesz zamiast tego użyć klasy System.Uri (http://msdn.microsoft.com/en-us/library/system.uri.aspx)? –

Odpowiedz

34

Drugi parametr w Substring jest długością podłańcucha, a nie indeksem końcowym.

Prawdopodobnie powinieneś włączyć obsługę, aby sprawdzić, czy rzeczywiście zaczyna się od tego, czego oczekujesz, zakończyć zgodnie z oczekiwaniami i jest co najmniej tak długo, jak się spodziewasz. A jeśli nie pasuje, możesz zrobić coś innego lub rzucić znaczący błąd.

Oto niektóre przykładowy kod, który sprawdza, czy adres URL zawiera struny, które również jest refactored trochę ułatwić zmianę prefiksu/sufiksu rozebrać:

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

Tak, ale Mando chce zrzucić część ".jpg". –

+0

O, oops, mój błąd. Naprawię to. –

+0

url.Length - 22 ??? Jak masz ten numer? – walther

6

Twój błąd to parametry do podciągu. Pierwszy parametr powinien być indeksem początkowym, a drugi powinien być długością lub odsunięciem od początkuindeksu.

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

Jeśli długość podciągu może się różnić, należy obliczyć długość.

Coś w kierunku (url.Length - 18) - 4 (lub url.Length - 22)

w końcu będzie to wyglądać mniej więcej tak

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

Długość części "aaa/bbb" zmienia się od czasu do czasu, więc nie jest dokładnie 7. Ale dziękuję za odpowiedź na moje pytanie. przegłosowała twoją odpowiedź :) – Manto

+0

22 jest poprawna, ponieważ chcesz poznać długość, a nie indeks – walther

2

Spróbuj to:

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

Trzeba znaleźć pozycję pierwszego /, a następnie obliczyć żądaną porcję:

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

Tak, to działa. – Manto

0

Oto kolejna propozycja. Jeśli można poprzedzić http: // do adresu URL można to zrobić

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

Jak o czymś takim:

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

Dobre rozwiązanie polegające wyłącznie na funkcjach bibliotecznych zamiast na hackowskich indeksach ciągów, co czyni je bardziej czytelnymi i solidniejszymi. –

0

można wykorzystywać prawo dopełnienie.

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

jeśli chcesz, aby kod był wyjątkowo bezpieczny. Spróbuj najpierw sprawdzić długość, zanim spróbujesz uzyskać podciąg. –

Powiązane problemy