我有一些要由应用程序打开的 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]].*"
尝试了其他几种方法,但都不起作用。请给出一个接受“范围”中允许子字符串的解决方案
使用像 PCRE 这样的完整正则表达式引擎,它会是这样的:
^\/(a|b[a-ce-z]|[e-f]).*
在此处查看实际操作:https://regex101.com/r/ftXk0b/1
据我了解,你不能使用
( | )
语法
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
您在评论中添加了您想要匹配的内容
/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次。我让你尝试一下,因为我无法在我这边测试它。