/ / Regex для перевірки координат (широта та довгота) масив у рядку - регулярний вираз, рядок, координати, широта-довгота

Regex для перевірки координат (широта та довгота) масив у рядку - регулярний вираз, рядок, координати, широта та довгота

Мені потрібен вираз REGEX для перевірки рядка, який виглядає так:

latitude,longitude|latitude,longitude|... (n of these pairs) ...|latitude,longitude

Тепер я REGEX для широта який:

/^(-?[1-8]?d(?:.d{1,18})?|90(?:.0{1,18})?)$/

і регулярний вираз для довгота який:

/^(-?(?:1[0-7]|[1-9])?d(?:.d{1,18})?|180(?:.0{1,18})?)$/

Оскільки я не розумію або коли-небудь робив вирази REGEX, я намагаюсь, щоб хтось, хто пережив це, забезпечив виразом, який перевірить мій рядок.

Я використовую це в PHP, Laravel 4.2, щоб бути конкретним. Але, я гадаю, рішення для цього буде працювати в Javascript, а також.

Відповіді:

1 для відповіді № 1

Неправильна ідея використовувати регулярні вирази такої складності, якщо ви не знаєте правильний регулярний вираз. Особливо, якщо вам потрібно використовувати його як в JS, так і в PHP.

Я пропоную використовувати цю техніку:

  • декларувати змінні (блоки) для довготи і широти
  • скласти регулярний вираз з необхідним синтаксисом, використовуючи ці блоки.

Отже, (у JS) ви блокуєте

var latitude = "(-?[1-8]?\d(?:\.\d{1,18})?|90(?:\.0{1,18})?)";
var longitude = "(-?(?:1[0-7]|[1-9])?\d(?:\.\d{1,18})?|180(?:\.0{1,18})?)";

Вираз "обгортки" буде

var regex_str = "^(?:" + latitude + "," + longitude + "(?:\|(?:" + latitude + "," + longitude + "))*$";

Кілька зауважень на це:

  • ^ - початок рядок якоря (тільки відповідає наступному підзаголовок, якщо він є першим символом у рядку вводу)
  • (?:...) - незахоплення груп, які лише групують, а не фіксують (тобто не зберігають жодного відповідного підрядку в будь-якому буфері)
  • \| - відповідає літературному | символ (потрібно втекти)
  • * - значення квантора 0 або більше входів попереднього підзаголовка (клас, група тощо)

Я повторюю зворотні косою рисками, як у JS, вам потрібен конструктор, щоб динамічно ініціалізувати регулярний вигватка (var rx = RegExp(regex_str)) У PHP ви можете використовувати $rx = "/$regex_str/".

The цілий регулярний вираз буде виглядати

/^(?:(-?[1-8]?d(?:.d{1,18})?|90(?:.0{1,18})?),(-?(?:1[0-7]|[1-9])?d(?:.d{1,18})?|180(?:.0{1,18})?))(?:|(?:(-?[1-8]?d(?:.d{1,18})?|90(?:.0{1,18})?),(-?(?:1[0-7]|[1-9])?d(?:.d{1,18})?|180(?:.0{1,18})?)))*$/