Android - соответствует шаблону url?

Я хотел бы, чтобы один из моих действий взял конкретный URL-адрес. Шаблон:

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

Компонентами пути "abc123" и "xyz789" может быть любая последовательность альфа-чисел, длинa > 1.

Выполнение этого в моем манифесте:

<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/.*" />

но кажется, что любой шаблон из моего домена совпадает, т.е.

myexample.com
myexample.com/whatever

оба совпадают. Возможно, оператор. * Не работает, как я ожидаю здесь? Любая помощь будет большой,

Спасибо

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

Ответы

Ответ 1

У меня была такая же проблема сегодня, мое решение было:

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

используя (.. *) в качестве замены для (. +)

В исходном вопросе я предполагаю, что это может работать:

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

Ответ 2

Так как ОС Android использует PatternMatcher и наблюдает из исходного кода и документацию, она может работать только с . * и \\ (escape-символы), возможно, потребуется немного творческого - т.е. используйте \\, чтобы остановить вычисление регулярных выражений, а затем возобновить с этого времени.

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

который будет соответствовать только myexample.com/whatever, а не myexample.com

Чтобы создать различные фильтры намерений с различным использованием uri / в конце uri, например

Пример решения, используйте http://www.example.com/abc123/foo/xyz789/ вместо http://www.example.com/abc123/foo/xyz789, а затем используйте

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

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

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

Ответ 3

проблема в том, что. * соответствует всем, - и ничего -, поэтому "/.*/" соответствует "//", что эквивалентно просто "/" в пути.

Кроме того, вы можете убедиться, что два сегмента пути "abc123" в вашем примере равны с поддерживаемым здесь соглашением выражений.

Другими словами, вы хотите изменить свои пути на нечто более простое, которое можно сопоставить. если это ваш компонент, который получает намерение, вы можете передать поддельный URL-адрес, который является просто переменной частью реального URL-адреса. например, если вы хотите совместить,

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

где две захваченные группы равны, просто передайте http://mystuff/abc123 в намерении и задайте шаблон данных http://mystuff/ *

затем проанализируйте это, когда вы получите намерение и преобразуете его в настоящий URL-адрес, заполнив известные константные части.

Ответ 4

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

Этот шаблон не работает для меня, чтобы реализовать http://example.com/0/h/mainpage/convo/837287

Есть ли решение для этого?

мне не нужно решение, как показано ниже:

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