使用正则表达式在android中使用pathAdvancedPattern进行深度链接

问题描述 投票:0回答:1

我有一些要由应用程序打开的 URL。它们通常以“a”或“ba”或“bb”或“bc”,“be”等开头,直到“bz”,“bd”除外。

I have used below to code in manifest: 

<data android:host="@string/deeplink_host"
      android:pathAdvancedPattern="/[a|ba-bc|be-bz].*"
      android:scheme="https"
/>

它接受以“a”开头的 URL,但在“ba”、“bb”等情况下不起作用(在检查 2 个字符(或子字符串)时)。我什至尝试使用下面的代码,但它们都不起作用。

Code-1:    android:pathAdvancedPattern="/[a|e-f|ba-bc|be-bz].*"
Code-2:    android:pathAdvancedPattern="/[a|e-f|b(a-c)|b(e-z)].*"
Code-3:    android:pathAdvancedPattern="/[a|e-f|b[a-c]|b[e-z]].*"

尝试了其他几种方法,但都不起作用。请给出一个接受“范围”中允许子字符串的解决方案

android regex deep-linking
1个回答
0
投票

如果你有一个真正的正则表达式

使用像 PCRE 这样的完整正则表达式引擎,它会是这样的:

^\/(a|b[a-ce-z]|[e-f]).*

在此处查看实际操作:https://regex101.com/r/ftXk0b/1

但是,不,你不能用 pathAdvancedPattern

做到这一点

据我了解,你不能使用

( | )
语法 pathAdvancedPattern,即使使用 PATTERN_ADVANCED_GLOB选项。这 有关处理复杂路径的文章 解释得很好。

所以问题是,将其重写为

/[a-f][a-ce-z].*
不会 也可以是解决方案。实际上,像
/address
这样的路径将 不匹配,因为第二个位置有
d

我不是100%确定,但你可能可以把它分成几个

<data>
标签,像这样:

<data android:host="@string/deeplink_host"
      android:pathAdvancedPattern="/[ac-f].*"
      android:scheme="https"
/>
<data android:host="@string/deeplink_host"
      android:pathAdvancedPattern="/b[ace-z].*"
      android:scheme="https"
/>

这样,第一个

<data>
标签将:

  • 匹配
    /a.*
  • /b.*
    不匹配(稍后在第二个
    <data>
    标签中完成)。
  • 匹配
    /c.*
    /d.*
    /e.*
    /f.*

第二个

<data>
标签将:

  • 匹配
    /ba.*
    /bb.*
    /bc.*
  • 与所需的
    /bd.*
    不匹配。
  • 匹配
    /be.*
    /bf.*
    ,...直到
    /bz.*

这是另一篇可以提供帮助的文章,其中解释了 如何在 Android 应用程序中管理复杂的 DeepLinks 方案

/services

回复您对 URL 的评论

您在评论中添加了您想要匹配的内容

/services/login.php
/servicesData
但不是任何其他 以
/services/...
开头的 URL。您尝试过使用 像
/services[^/].*
这样的模式会匹配像这样的 URL
/servicesData
/services-flow
/servicestate

因为你不能使用正确的正则表达式但必须坚持 对于高级 GLOB 模式,您必须使用两种模式, 就像我在上面的回答中提出的那样:

<data android:host="@string/deeplink_host"
      android:pathAdvancedPattern="/services/login\\.php"
      android:scheme="https"
/>
<data android:host="@string/deeplink_host"
      android:pathAdvancedPattern="/servicesData"
      android:scheme="https"
/>

要匹配“login.php”中的点,您必须添加两个 前面有反斜杠。第一个是因为模式中的

.
通常用于匹配任何字符,因此在前面添加反斜杠 是转义它并说“匹配点字符”。 第二个反斜杠是因为我看到 这篇文章 XML 本身使用反斜杠来转义某些字符。

如果您需要匹配

/servicesData
/servicesData/
, 那么你可能可以尝试这样修改它:

<data android:host="@string/deeplink_host"
      android:pathAdvancedPattern="/servicesData/{0,1}"
      android:scheme="https"
/>

{0,1}
表示正在进行中,这里是“/”字符,可以 重复0到1次。我让你尝试一下,因为我无法在我这边测试它。

© www.soinside.com 2019 - 2024. All rights reserved.