🔗

【Android】DeepLinkで正規表現を使う(pathAdvancedPattern)

2023/06/10に公開

はじめに

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/ascheme://host/aaaで反応するのは問題ありません。しかし、それ以外のscheme://host/abcscheme://host/123などのあらゆるパターンでも反応しています 🫠

どうやらAPI31未満の場合 pathAdvancedPatternは動作しないのではなく、 pathPattern="/.*"と同等の動きになってしまうようです...

そのため、API31未満もサポートしているアプリ(ほとんどのアプリがそうだと思いますが)ではpathAdvancedPatternを導入するのが厳しそうでした。

この問題の解決方法等ご存知の方いましたら情報お待ちしています 🙇‍

以上です。

参考

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

https://proandroiddev.com/how-to-handle-deep-link-with-complex-path-like-this-811216a0c802

Discussion