Считайте не с помощью RegExp. Если вы сначала проанализируете ввод как URI, вы получите нормализацию и все равно сможете запрашивать отдельные части:
bool isWazeDeepLink(String url) {
var parsedUrl = Uri.parse(url);
if (parsedUrl.isScheme("http") &&
parsedUrl.host == "www.waze.com" &&
parsedUrl.path == "/ul" &&
parsedUrl.queryParameters["ll"] != null) {
// Or check format of the `ll` parameter
return true;
}
return false;
}
Вы также можете использовать RegExp, но вы должны учитывать, что схема и host поля нечувствительны к регистру, как и %2c
escape, но путь - нет, поэтому вам нужно что-то вроде:
var re = RegExp(r"^[hH][tT][tT][pP]://[wW]{3}\.[wW][aA][zZ][eE]\.[cC][oO][mM]"
r"/ul\?.*(?<=[?&])ll=(?:-?\d+(?:\.\d+))%2[C](?:-?\d+(?:\.\d+))(?:[&#]|$)");
Это будет соответствовать http://www.waze.com/
в любом случае, затем ul
в нижнем регистре, а затем любая следующая строка, содержащая полный параметр URL (с префиксом ?
og &
, за которым следует &
, #
или конец), что имеет формат ll=
, за которым следует число, %2c
или %2C
и еще один номер.
(Или вы можете начать с анализа ввода как URI, а затем выполнить toString
, чтобы получить нормализованный URI, тогда будут работать и другие предложенные здесь регулярные выражения).