Android - 匹配网址模式?

时间:2011-01-21 18:11:03

标签: android android-intent intentfilter

我希望我的一项活动能够获取特定的网址。模式是:

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

3 个答案:

答案 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。