2011-01-21 16 views
14

Me gustaría que una de mis actividades recoja una URL en particular. El patrón es:Android: ¿coincide con un patrón de URL?

http://www.example.com/abc123/foo/xyz789 

La componentes de la ruta "abc123" y "xyz789" puede ser cualquier secuencia de caracteres alfanuméricos, longitud> 1.

Hacer esto en mi manifiesto:

<activity> 
    <intent-filter> 
    <action 
     android:name="android.intent.action.VIEW" /> 
    <category 
     android:name="android.intent.category.DEFAULT" /> 
    <category 
     android:name="android.intent.category.BROWSABLE" /> 

    <data 
     android:scheme="http" 
     android:host="example.com" 
     android:pathPattern="/.*/foo/.*" /> 

pero parece que cualquier patrón de mi dominio se está igualada, es decir:

myexample.com 
myexample.com/whatever 

ambos obtienen emparejados. Supongo que quizás el operador. * No esté funcionando como espero aquí. Cualquier ayuda sería grande,

Gracias

http://developer.android.com/guide/topics/manifest/data-element.html

Respuesta

1

El problema es que. * Coincide con todo, nada--y, por lo que "/.*/" coincidencias "//", lo que equivale simplemente "/" en un camino.

Además, puede asegurarse de que los dos segmentos de ruta "abc123" en su ejemplo son iguales con la expresión compatible aquí.

en otras palabras, querrá cambiar sus caminos a algo más simple que pueda emparejarse. si es su componente el que recibe la intención, puede pasar una URL falsa que sea solo las partes variables de la URL real. por ejemplo, si desea hacer coincidir,

http://www.example.com/.+/foo/.+ 

donde los dos grupos capturados son iguales, sólo tiene que pasar http://mystuff/abc123 en el intento, y establecer el patrón de datos a http://mystuff/ *

continuación, analizar que cuando reciba el intento, y transformarlo en la URL real al completar las partes constantes conocidas.

+0

Hola, gracias por la información, los dos grupos será diferente (Q actualizado para reflejar). ¿Podemos usar el operador. +? Esto parece coincidir con todo: pattern = "/.+ foo /.+" – user291701

+0

los documentos que citó no mencionan ". +". –

12

Desde OS androide utiliza PatternMatcher y observando desde source code y documentación sólo puede trabajar con .* y \\ (caracteres de escape) que podría tener que ser un poco creativo - es decir, utilizar \\ para detener la evaluación de expresiones regulares y luego retomar a partir de entonces adelante.

<data 
       android:host="example.com" 
       android:pathPattern=".*\\/foo/.*" 
       android:scheme="http"/> 

que sólo igualará myexample.com/whatever y no myexample.com

para crear diferentes filtros intención con variando uso uri / al final de la URI como solución de muestra

, utilice http: // www .example.com/abc123/foo/xyz789/ en lugar de http://www.example.com/abc123/foo/xyz789 y luego utilice

example.com/abc123/~~V~~3rd android:pathPattern=".*\\/

example.com/abc123/foo/xyz789/ android:pathPattern=".*\\/foo/.*\\/

ejemplo.com/abc123/foo/xyz789/bar/uvx456/android:pathPattern=".*\\/foo/.*\\/bar/.*\\/

29

Yo tenía el mismo problema hoy en día, mi solución fue:

<data android:pathPattern="/remotes/..*/..*"/> 

usando (.. *) como un reemplazo para (+).

En el caso de la pregunta original que supongo que esto puede funcionar:

<data 
       android:host="example.com" 
       android:pathPattern="..*/foo/..*" 
       android:scheme="http"/> 
+1

Esto es muy valioso. .. * coincide con 1 o más ocurrencias de cualquier personaje. – xeed

+0

¡Muchas gracias! ¡Eso es exactamente lo que estaba buscando! :) –

Cuestiones relacionadas