【Android】DeepLinkで正規表現を使う(pathAdvancedPattern)
はじめに
AndroidでDeepLink(AppLinks)を使う場合、AndroidManifestにインテントフィルターを記述してアプリが反応するURLを指定します。
しかし、URLを指定する際に使用できる特殊文字はこれまで「.
」と「*
」のみだったため、複雑なパターンに対応することが困難でした。
そんな中、API31でpathAdvancedPattern
という属性が追加され、使用できる特殊文字が増え、複雑なパターンに対応できるようになったのでこれについて検証してみました。
※タイトルに「正規表現」と書いてますが正確には「正規表現っぽいもの」になります。
検証
pathAdvancedPattern
は以下6つの特殊文字を使用することができます。「.
」と「*
」はこれまでと同様のため、それ以外について記述します。
.
*
+
[...]
^
{...}
+
: 直前のパターンの 1 回以上の繰り返しと一致
+
は直前のパターンの1回以上の繰り返しと一致します。
例1: pathAdvancedPattern="/a+"
URL | アプリが反応するかどうか |
---|---|
scheme://host/a | ○ |
scheme://host/aaa | ○ |
scheme://host/b | ✗ |
例2: pathAdvancedPattern="/.+"
URL | アプリが反応するかどうか |
---|---|
scheme://host/a | ○ |
scheme://host/aaa | ○ |
scheme://host/b | ○ |
scheme://host/ | ✗ |
1回以上の繰り返しのため、/.*
とは違いscheme://host/
は開かないです。
[...]
: 範囲一致
[...]
は数値や英字の範囲指定をすることができます。また、否定修飾子の^
も使うことができます。
例1: pathAdvancedPattern="/[0-9]+"
URL | アプリが反応するかどうか |
---|---|
scheme://host/0 | ○ |
scheme://host/123 | ○ |
scheme://host/abc | ✗ |
scheme://host/abc123 | ✗ |
例2: pathAdvancedPattern="/[a-z]+"
URL | アプリが反応するかどうか |
---|---|
scheme://host/a | ○ |
scheme://host/abc | ○ |
scheme://host/ABC | ✗ |
scheme://host/123 | ✗ |
例3: pathAdvancedPattern="/[^a-z]+"
URL | アプリが反応するかどうか |
---|---|
scheme://host/abc | ✗ |
scheme://host/123 | ○ |
scheme://host/ABC | ○ |
scheme://host/abc123 | ✗ |
否定修飾子が使えるようになったのはかなり嬉しいですね。
{...}
: 一致回数
{...}
はパターンが一致する回数を指定できます。
例1: pathAdvancedPattern="/[a-z]{3}"
URL | アプリが反応するかどうか |
---|---|
scheme://host/abc | ○ |
scheme://host/a | ✗ |
scheme://host/abcde | ✗ |
例2: pathAdvancedPattern="/[a-z]{2,4}"
URL | アプリが反応するかどうか |
---|---|
scheme://host/ab | ○ |
scheme://host/abcd | ○ |
scheme://host/abcde | ✗ |
,
で区切ることで一致回数の範囲を指定することができます。
備考
API31(Android12)未満の場合
pathAdvancedPattern
はAPI31で導入されたものなのですが、pathAdvancedPattern
記述したアプリをAPI31未満で動かすと想定外の挙動をします。
例: pathAdvancedPattern="/a+"
URL | アプリが反応するかどうか |
---|---|
scheme://host/a | ○ |
scheme://host/aaa | ○ |
scheme://host/b | ○ |
scheme://host/abc | ○ |
scheme://host/123 | ○ |
scheme://host/ABC | ○ |
a
の1文字以上の繰り返しというパターンを記述したため、scheme://host/a
やscheme://host/aaa
で反応するのは問題ありません。しかし、それ以外のscheme://host/abc
やscheme://host/123
などのあらゆるパターンでも反応しています 🫠
どうやらAPI31未満の場合 pathAdvancedPattern
は動作しないのではなく、 pathPattern="/.*"
と同等の動きになってしまうようです...
そのため、API31未満もサポートしているアプリ(ほとんどのアプリがそうだと思いますが)ではpathAdvancedPattern
を導入するのが厳しそうでした。
この問題の解決方法等ご存知の方いましたら情報お待ちしています 🙇
以上です。
参考
Discussion