我希望我的一项活动能够获取特定的网址。模式是:
http://www.example.com/abc123/foo/xyz789
路径分量“abc123”和“xyz789”可以是任何α数字序列,长度> 1。 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
答案 0 :(得分:31)
我今天遇到了同样的问题,我的解决方案是:
<data android:pathPattern="/remotes/..*/..*"/>
使用(.. *)代替(。+)
在原始问题的情况下,我猜这可行:
<data
android:host="example.com"
android:pathPattern="..*/foo/..*"
android:scheme="http"/>
答案 1 :(得分:14)
由于Android操作系统使用PatternMatcher并观察source code及其文档,因此只能使用.
*
和\\
(转义字符),我们可能需要要有点创造性 - 即使用\\
来阻止正则表达式评估,然后从那时起恢复。
<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/.*\\/
答案 2 :(得分:1)
问题是。*匹配所有内容,而且没有 - 所以“/.*/”匹配“//”,这相当于路径中的“/”。
另外,您可以确保示例中的两个路径段“abc123”与此处支持的表达式相同。
换句话说,您希望将路径更改为可以匹配的更简单的路径。如果它是你的组件正在接收意图,你可以传递一个假URL,它只是真实URL的可变部分。例如,如果你想匹配,
http://www.example.com/.+/foo/.+
两个捕获的组相等,只需在意图中传递http://mystuff/abc123,并将数据模式设置为http://mystuff/ *
然后在收到意图时解析它,并通过填写已知的常量部分将其转换为真实的URL。