2012-06-06 20 views
5

Mam następujący ciąg:Extract podciąg po pewnym wzorem

http://xxx/Content/SiteFiles/30/32531a5d-b0b1-4a8b-9029-b48f0eb40a34/05%20%20LEISURE.mp3?&mydownloads=true 

Jak można wyodrębnić część po 30/? W tym przypadku jest to 32531a5d-b0b1-4a8b-9029-b48f0eb40a34. Mam inne ciągi mające tę samą część upto 30/i potem każdy ciąg ma inny id do następnego/który chcę.

+1

Biorąc dowolny ciąg znaków, co są zasady ustalania, którą część trzymasz? Czy zachowujesz tylko część pasującą do formatu GUID, który jest [określony w .NET z D] (http://msdn.microsoft.com/en-us/library/97af8hh4.aspx)? –

+0

jeśli istnieje wiele takich ciągów o różnych przedrostków i jak mówisz wzór, może chcesz przyjrzeć 'Regular Expressions' – Ankit

+0

Byłoby lepiej, jeśli nie sothing podobna do tej http: // stackoverflow. com/questions/27745/get-parts-of-a-url-regex –

Odpowiedz

3

split funkcją String klasie nie pomoże w tym przypadku, ponieważ odrzuca ogranicznika i nie jest to, co chcemy tutaj. musisz stworzyć wzór, który wygląda z tyłu. Spojrzenie za synatax jest:

(?<=X)Y 

który identyfikuje każdą Y który jest poprzedzony X.

Więc w ty przypadku trzeba tego wzoru:

(?<=30/).* 

kompilacji wzór, dopasować go do swojej wejścia, znajdź mecz i złapać go:

String input = "http://xxx/Content/SiteFiles/30/32531a5d-b0b1-4a8b-9029-b48f0eb40a34/05%20%20LEISURE.mp3?&mydownloads=true"; 
Matcher matcher = Pattern.compile("(?<=30/).*").matcher(input); 
matcher.find(); 
System.out.println(matcher.group()); 
+0

otrzymuję cały ciąg odpoczynku – user1196969

+0

Przepraszam, myślałem, że tego właśnie chcesz. wtedy wzór będzie: (? <= 30 /) [^ /] * – Untitled

+0

Dzięki Sahand Mozaffari – user1196969

2

Tylko dla tego, czy chcesz ogólny sposób, aby to zrobić?

String[] out = mystring.split("/") 
return out[out.length - 2] 

Myślę, że/jest zdecydowanie ogranicznikiem, którego szukasz. Nie widzę problemu, o którym mówisz Alex

EDYCJA: Ok, Python dostał mnie z indeksami.

+0

To nie działa, ponieważ są "/" s po "0 /". –

+0

Dlatego nakładam rozmiar -1. Aby zwrócić dokładnie 32531a5d-b0b1-4a8b-9029-b48f0eb40a34 – jlengrand

+1

Powracasz tutaj ostatnią część łańcucha, on naprawdę potrzebuje sekundy do końca: 'return out [out.length - 2];' –

6

Można zrobić tak:

String s = "http://xxx/Content/SiteFiles/30/32531a5d-b0b1-4a8b-9029-b48f0eb40a34/05%20%20LEISURE.mp3?&mydownloads=true"; 
     System.out.println(s.substring(s.indexOf("30/")+3, s.length())); 
+0

Chociaż jest to z pewnością odpowiedź na jego pytanie, nie sądzę, żeby chciał całej reszty struny. Plus, dlaczego używałbyś 2-argumentowej wersji podłańcucha, jeśli zamierzasz używać długości jako drugiego argumentu? Wyszukaj wersję 1-arg. – billjamesdev

+0

otrzymuję cały ciąg spoczynkowy – user1196969

1

Wyrażenie regularne jest odpowiedzią myślę. Jednak sposób zapisywania wyrażenia zależy od formatu danych (adresu URL), który ma zostać przetworzony. Jak ten:

Pattern pat = Pattern.compile("/Content/SiteFiles/30/([a-z0-9\\-]+)/.*"); 
    Matcher m = pat.matcher("http://xxx/Content/SiteFiles/30/32531a5d-b0b1-4a8b-9029-b48f0eb40a34/05%20%20LEISURE.mp3?&mydownloads=true"); 
    if (m.find()) { 
     System.out.println(m.group(1)); 
    } 
+0

Dostaję ostatnią część napisu również z tego, to po ostatnim/którego nie chcę I juat chcę drugą ostatnią część – user1196969

+0

Zrobiłem małe modyfikacje mojej odpowiedzi. –

+0

nadal otrzymuję ostatnią część stringa – user1196969