Android - 匹配网址模式?

use*_*701 19 android intentfilter android-intent

我喜欢我的一项活动来获取特定的网址.模式是:

http://www.example.com/abc123/foo/xyz789
Run Code Online (Sandbox Code Playgroud)

路径分量"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/.*" />
Run Code Online (Sandbox Code Playgroud)

但似乎我的域中的任何模式都匹配,即:

myexample.com
myexample.com/whatever
Run Code Online (Sandbox Code Playgroud)

两者都匹配.我想也许.*运算符不能像我期望的那样工作?任何帮助都会很棒,

谢谢

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

Cro*_*ull 31

我今天遇到了同样的问题,我的解决方案是:

   <data android:pathPattern="/remotes/..*/..*"/>
Run Code Online (Sandbox Code Playgroud)

使用(..*)代替(.+)

在原始问题的情况下,我猜这可以工作:

<data
                android:host="example.com"
                android:pathPattern="..*/foo/..*"
                android:scheme="http"/>
Run Code Online (Sandbox Code Playgroud)

  • 这非常有价值...*匹配任何字符的1个或多个出现. (2认同)

raj*_*raj 14

由于Android操作系统使用PatternMatcher并从源代码和文档中观察它只能使用. *\\(转义字符)我们可能需要有点创意 - 即,用于\\停止正则表达式评估,然后从那时起恢复.

<data
                android:host="example.com"
                android:pathPattern=".*\\/foo/.*"
                android:scheme="http"/>
Run Code Online (Sandbox Code Playgroud)

这只会匹配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/.*\\/


Jef*_*man 1

问题是 .* 匹配所有内容,但什么也不匹配,因此“/.*/”匹配“//”,这相当于路径中的“/”。

此外,您还可以确保示例中的两个路径段“abc123”与此处支持的表达式匹配器相同。

换句话说,您想要将路径更改为可以匹配的更简单的路径。如果是您的组件接收意图,您可以传递一个假 URL,它只是真实 URL 的可变部分。例如,如果你想匹配,

http://www.example.com/.+/foo/.+
Run Code Online (Sandbox Code Playgroud)

如果两个捕获组相等,只需在意图中传递http://mystuff/abc123,并将数据模式设置为http://mystuff/*

然后在收到意图时对其进行解析,并通过填充已知的常量部分将其转换为真实的 URL。