2011-01-21 3 views
14

Я бы хотел, чтобы один из моих мероприятий взял конкретный адрес. Узор:Android - соответствие шаблону URL?

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

компоненты пути "ABC123" и "xyz789" может быть любая последовательность альфа-числовых значений, длина> 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

проблема в том, что. * Соответствует всем; и nothing-, так "/.*/" спички "//", что эквивалентно просто «/» в пути.

Кроме того, вы можете гарантировать, что два сегмента пути «abc123» в вашем примере равны с поддерживаемым здесь выражением.

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

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

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

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

+0

Привет, спасибо за информацию, обе группы будут отличаться (обновленный Q для отражения). Можно ли использовать оператор. +? Кажется, что это все еще соответствует everthing: pattern = "/.+/ foo /.+" – user291701

+0

в цитированных вами документах не упоминается «. +». –

12

Поскольку Android OS использует PatternMatcher и наблюдения из source code и документации он может работать только с .* и \\ (управляющие символы), мы, возможно, должны быть немного творческим - то есть, использовать \\ остановить регулярное выражение оценки, а затем возобновить с тех пор и далее.

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

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

Для создания различных намерений фильтров с различными Uri использования / в конце Ури как

раствора пробы, используйте HTTP: // WWW .example.com/абв123/Foo/xyz789/ вместо http://www.example.com/abc123/foo/xyz789, а затем использовать

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

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

пример.ком/абв123/Foo/xyz789/бар/uvx456/android:pathPattern=".*\\/foo/.*\\/bar/.*\\/

29

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

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

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

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

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

Это супер ценно. .. * соответствует 1 или более встречам любого персонажа. – xeed

+0

Большое вам спасибо! Это именно то, что я искал! :) –

Смежные вопросы