Мені потрібен вираз 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})?)))*$/