2012-06-06 16 views
5

tengo la siguiente cadena:Extracto subcadena después de un cierto patrón

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

¿Cómo puedo extraer la pieza después de 30/? En este caso, es 32531a5d-b0b1-4a8b-9029-b48f0eb40a34. Tengo otras cadenas que tienen la misma parte hasta 30/y después de eso cada cadena tiene ID diferente hasta el próximo/que yo quiera.

+1

Dada una cadena arbitraria, lo Cuáles son las reglas para determinar qué parte conservas? ¿Solo conserva la parte que coincide con el formato GUID que está [especificado en .NET con una D] (http://msdn.microsoft.com/en-us/library/97af8hh4.aspx)? –

+0

si hay una gran cantidad de tales cadenas con diferentes prefijos y como usted dice un patrón, es posible que quieras vistazo a 'Expressions' regular – Ankit

+0

Sería mejor si sothing similar a este http: // stackoverflow. com/questions/27745/getting-parts-of-a-url-regex –

Respuesta

3

split función de String clase no le ayudará en este caso, ya que descarta el delimitador y eso no es lo que queremos aquí. necesitas hacer un patrón que mira hacia atrás. La mirada detrás synatax es:

(?<=X)Y 

que identifica cualquier Y que es precedida por un X.

Así pues, en que caso de que necesite este patrón:

(?<=30/).* 

compilar el patrón, haga coincidir con su entrada, busque la medida, y la captura:

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

obteniendo cadena de descanso completa – user1196969

+0

lo siento, pensé que eso era lo que querías. entonces el patrón sería: (? <= 30 /) [^ /] * – Untitled

+0

Gracias Sahand Mozaffari – user1196969

2

¿Solo para esta, o quieres una forma genérica para hacerlo?

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

Creo que el/es definitivamente el delimitador que está buscando. No puedo ver el problema del que está hablando Alex

EDITAR: Ok, Python me consiguió los índices.

+0

Esto no funciona, ya que hay "/" después del "0 /". –

+0

Es por eso que estoy poniendo tamaño -1. Para volver exactamente 32531a5d-b0b1-4a8b-9029-b48f0eb40a34 – jlengrand

+1

Usted está devolviendo la última parte de la cadena de aquí, que en realidad necesita el penúltimo: 'volver a cabo [out.length - 2];' –

6

Se puede hacer así:

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

Si bien esta es sin duda una respuesta a su pregunta, no creo que quisiera todo el resto de la cadena. Además, ¿por qué usarías la versión de 2 argumentos de la subcadena, si solo vas a usar la longitud como el segundo argumento? Busque la versión de 1 arg. – billjamesdev

+0

obteniendo toda la cadena de descanso – user1196969

1

expresión regular es la respuesta que pienso. Sin embargo, la forma en que se escribe la expresión depende del formato de datos (url) que desea procesar. Como éste:

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

Estoy obteniendo la última parte de la cadena también de esto, es decir, después de la última/que no quiero Quiero la segunda parte más reciente – user1196969

+0

Hice algunas modificaciones a mi respuesta. –

+0

todavía estoy obteniendo la última parte de la cadena – user1196969

Cuestiones relacionadas