Проверка правильности строки Ссылка Waze Live Map

Я пытаюсь проверить, является ли строка действительной прямой ссылкой из Waze Live Map. Глубинная ссылка 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

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


person atefsawaed    schedule 01.08.2020    source источник
comment
Я бы попытался помочь, но я не знаю, что такое Deep Waze. Может быть, вы могли бы перечислить некоторые конкретные разрешенные символы и все такое. Или, кажется, вы знакомы с регулярными выражениями, с какой конкретной проблемой регулярных выражений у вас возникли проблемы?   -  person    schedule 01.08.2020
comment
Кроме того, я не советую создавать объект регулярного выражения и вызывать его в стеке.   -  person    schedule 01.08.2020
comment
Обратите внимание, что ссылки на контент Waze, которые всегда имеют параметр ll, согласно developers.google.com/waze/deeplinks (у них может быть, например, ссылка для перехода к избранному и другим)   -  person Mattia    schedule 02.08.2020


Ответы (5)


Использовать

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

См. доказательство.

Удалите точки, чтобы соответствовать буквальным точкам, и у вас есть ?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
person Ryszard Czech    schedule 01.08.2020

Попробуйте не использовать регулярное выражение. Если вы сначала проанализируете ввод как 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, но вы должны учитывать, что поля scheme и 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 (с префиксом ? или &, за которым следует &, # или конец), который имеет формат ll=, за которым следует число , %2c или %2C и еще один номер.

(Или вы можете начать с разбора ввода как URI, а затем выполнить toString, чтобы получить нормализованный URI, тогда другие предложенные здесь регулярные выражения также будут работать).

person lrn    schedule 02.08.2020

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

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

Демо

person jdaz    schedule 01.08.2020

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

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

Демонстрация регулярных выражений

Подробнее

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

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

%2C-: символы между координацией

person mjrezaee    schedule 01.08.2020

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

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

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

Посмотрите демонстрацию здесь.

person marianc    schedule 01.08.2020