检查字符串是否有效 Waze Live Map link

Checking if a string is valid Waze Live Map link

我正在尝试从 Waze Live Map 检查字符串是否是有效的深度 link。 Waze Live Map 深 link 看起来像这样:

https://www.waze.com/ul?place=ChIJj61dQgK6j4AR4GeTYWZsKWw&ll=37.42199990%2C-122.08405750&navigate=yes

给定一个字符串,我想知道它是否是有效的 Waze 实时地图 link。最重要的是,我想知道它是否至少有经度和纬度。

我尝试了以下方法:

String str = 'https://www.waze.com/ul?place=ChIJj61dQgK6j4AR4GeTYWZsKWw&ll=37.42199990%2C-122.08405750&navigate=yes'; 
var wazeUrlPattern = r"https:\/\/www.waze.com\/ul\?ll\=(.)*([1-9]+\.[1-9]+)%2C([1-9]+\.[1-9]+)(.)?";
bool valid = new RegExp(wazeUrlPattern, caseSensitive:false).hasMatch(str);
if(!valid) {
    print("The url is not valid waze live map link!");
    return;
  }
// Do something with the longitude and latitude and maybe other parameters

这对我不起作用,我需要一些帮助来解决问题。

你可以使用这个:

var wazeUrlPattern = r"https://www\.waze\.com/ul\?.*ll=[\d.-]+%2C[\d.-]+";

Demo

使用

https://www\.waze\.com/ul\?.*?&ll=(-?\d+\.\d+)%2C(-?\d+\.\d+)

proof

转义点以匹配文字点,您有 ?ll,而 URL 后面有 ?place&ll=。另外,经度和纬度前面可能有可选的-

解释

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  https://www              'https://www'
--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
  waze                     'waze'
--------------------------------------------------------------------------------
  \.                       '.'
--------------------------------------------------------------------------------
  com/ul                   'com/ul'
--------------------------------------------------------------------------------
  \?                       '?'
--------------------------------------------------------------------------------
  .*?                      any character except \n (0 or more times
                           (matching the least amount possible))
--------------------------------------------------------------------------------
  &ll=                     '&ll='
--------------------------------------------------------------------------------
  (                        group and capture to :
--------------------------------------------------------------------------------
    -?                       '-' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
  )                        end of 
--------------------------------------------------------------------------------
  %2C                      '%2C'
--------------------------------------------------------------------------------
  (                        group and capture to :
--------------------------------------------------------------------------------
    -?                       '-' (optional (matching the most amount
                             possible))
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
  )                        end of 

您可以使用以下正则表达式:

https:\/\/www\.waze\.com\/ul\?.*?ll\=(\d+\.\d+)%2C-(\d+\.\d+)

Regex Demo

详情

https:\/\/www\.waze\.com\/ul\?.*?\&:匹配 url 直到 ll 参数

(\d+\.\d+): 数字和一个点字符的组合

%2C-:字符间协调

试试这个正则表达式:

https:\/\/www\.waze\.com\/ul\?place=([^&]*)&ll=-?([1-9]\d*\.\d+)%2C-?([1-9]\d*\.\d+).*

为方便起见,您将安排在 $1(第 1 组)上,其余组将提供经度和纬度。

请检查demo here

考虑使用正则表达式。如果您首先将输入解析为 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,但您应该考虑 schemehost 字段不区分大小写, %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,然后此处建议的其他正则表达式将起作用以及)。