【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