Проверка правильности строки ссылки Waze Live Map - PullRequest
1 голос
/ 01 августа 2020

Я пытаюсь проверить, является ли строка действительной ссылкой на контент из Waze Live Map. A Waze Live Map ссылка на контент выглядит примерно так:

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

Учитывая строку, я хочу знать, является ли это действительной ссылкой на живую карту Waze. Самое главное, я хочу знать, есть ли у него хотя бы долгота и широта.

Я пробовал следующее:

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

Это не работает для меня, и мне нужна помощь в выяснении проблемы.

Ответы [ 5 ]

2 голосов
/ 02 августа 2020

Считайте не с помощью 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, тогда будут работать и другие предложенные здесь регулярные выражения).

2 голосов
/ 01 августа 2020

Используйте

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

См. proof

escape-точки для соответствия буквальным точкам, и у вас есть ?ll, а есть ?place и &ll= позже в URL. Кроме того, долгота и широта могут иметь необязательное - впереди.

ОБЪЯСНЕНИЕ

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 \1:
--------------------------------------------------------------------------------
    -?                       '-' (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 \1
--------------------------------------------------------------------------------
  %2C                      '%2C'
--------------------------------------------------------------------------------
  (                        group and capture to \2:
--------------------------------------------------------------------------------
    -?                       '-' (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 \2
1 голос
/ 01 августа 2020

Попробуйте это регулярное выражение:

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

Для удобства у вас будет место на $ 1 (группа 1), а оставшиеся группы предоставят долготу и широту.

Пожалуйста, проверьте демо здесь .

1 голос
/ 01 августа 2020

Вы можете использовать следующее регулярное выражение:

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

Regex Demo

Подробности

https:\/\/www\.waze\.com\/ul\?.*?\&: соответствует URL-адресу до ll аргумента

(\d+\.\d+): комбинации цифр и одной точки

%2C-: символов между согласованием

1 голос
/ 01 августа 2020

Вы можете использовать это:

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...