2012-06-06 27 views
5

Tôi có chuỗi sau:Extract chuỗi sau một khuôn mẫu nhất định

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

Làm thế nào tôi có thể trích xuất các phần sau 30/? Trong trường hợp này, nó là 32531a5d-b0b1-4a8b-9029-b48f0eb40a34. Tôi có một chuỗi có cùng một phần tối đa 30/và sau đó mỗi chuỗi có id khác nhau tối đa tiếp theo/mà tôi muốn.

+1

Với một chuỗi tùy ý, những gì quy tắc để xác định phần nào bạn giữ? Bạn chỉ giữ phần phù hợp với định dạng GUID được [được chỉ định trong .NET với D] (http://msdn.microsoft.com/en-us/library/97af8hh4.aspx) không? –

+0

nếu có rất nhiều chuỗi như vậy với các tiền tố khác nhau và khi bạn nói một mẫu, bạn có thể muốn xem 'Biểu thức chính quy' – Ankit

+0

Sẽ tốt hơn nếu bạn sothing tương tự như này http: // stackoverflow. com/questions/27745/get-parts-of-a-url-regex –

Trả lời

3

split chức năng của String lớp sẽ không giúp bạn trong trường hợp này, bởi vì nó loại bỏ các dấu phân cách và đó không phải là những gì chúng ta muốn ở đây. bạn cần tạo ra một khuôn mẫu trông phía sau. Nhìn đằng sau synatax là:

(?<=X)Y 

nào xác định bất kỳ Y được đi trước bởi một X.

Vì vậy, trong bạn trường hợp bạn cần mô hình này:

(?<=30/).* 

lập mô hình, kết hợp nó với đầu vào của bạn, tìm trận đấu, và bắt nó:

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

nhận toàn bộ chuỗi còn lại – user1196969

+0

xin lỗi, tôi nghĩ đó là những gì bạn muốn. sau đó mô hình sẽ là: (? <= 30 /) [^ /] * – Untitled

+0

Cảm ơn Sahand Mozaffari – user1196969

2

Chỉ dành cho điều này, hoặc bạn có muốn một cách chung để làm điều đó không?

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

Tôi nghĩ rằng/chắc chắn là dấu phân cách bạn đang tìm kiếm. Tôi không thể thấy sự cố bạn đang nói về Alex

EDIT: Ok, Python đã cho tôi các chỉ mục.

+0

Điều này không hoạt động vì có "/" sau "0 /". –

+0

Đó là lý do tại sao tôi đặt kích thước -1. Để trả lại chính xác 32531a5d-b0b1-4a8b-9029-b48f0eb40a34 – jlengrand

+1

Bạn đang trả về phần cuối của chuỗi ở đây, anh ta thực sự cần thứ hai cuối cùng: 'return out [out.length - 2];' –

6

Bạn có thể làm như thế này:

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

Trong khi điều này chắc chắn là câu trả lời cho câu hỏi của anh ấy, tôi không nghĩ anh ấy muốn toàn bộ phần còn lại của chuỗi. Plus, tại sao bạn sẽ sử dụng phiên bản 2-đối số của chuỗi con, nếu bạn chỉ sử dụng độ dài làm đối số thứ 2? Tra cứu phiên bản 1-arg. – billjamesdev

+0

nhận được toàn bộ chuỗi còn lại – user1196969

1

biểu hiện thường xuyên là câu trả lời tôi nghĩ. Tuy nhiên, cách biểu thức được viết phụ thuộc vào định dạng dữ liệu (url) mà bạn muốn xử lý. Như thế này một:

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

Tôi nhận được phần cuối cùng của chuỗi cũng từ điều này tức là sau khi cuối cùng/mà tôi không muốn tôi juat muốn phần thứ hai cuối cùng – user1196969

+0

Tôi đã thực hiện một chút sửa đổi cho câu trả lời của mình. –

+0

Tôi vẫn nhận được phần cuối cùng của chuỗi – user1196969

Các vấn đề liên quan