#javascript #regex
Вопрос:
Я использую небольшой метод javascript, который получает список точек, и я должен прочитать эти точки, чтобы создать полигон на карте Google.
Я получаю эти баллы в форме:
(лат, длинный), (лат, длинный),(лат, длинный)
Поэтому я выполнил следующее регулярное выражение:
(s*([0-9.-] )s*,s([0-9.-] )s*)
Я протестировал его с помощью RegexPal и точных данных, которые я получаю:
(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)
и это работает, так почему же, когда у меня есть этот код в моем javascript, я получаю в результате null?
var polygons="(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262)";
var reg = new RegExp("/(s*([0-9.-] )s*,s([0-9.-] )s*)/g");
var result = polygons.match(reg);
У меня нет ошибки javascript при выполнении(в режиме отладки Google Chrome). Этот код размещен в функции javascript, которая находится во включенном файле JS. Этот метод вызывается в методе OnLoad.
Я много искал, но не могу найти, почему это не работает. Большое спасибо!
Ответ №1:
Используйте литерал регулярного выражения [MDN]:
var reg = /(s*([0-9.-] )s*,s([0-9.-] )s*)/g;
Вы допускаете две ошибки при использовании RegExp
[MDN]:
- «Разделители»
/
не должны быть частью выражения - Если вы определяете выражение как строку, вам необходимо избежать обратной косой черты, потому что это escape — символ в строках
Кроме того, модификаторы передаются в качестве второго аргумента функции.
Поэтому, если бы вы хотели использовать RegExp
(что в данном случае вам не нужно), эквивалентом было бы:
var reg = new RegExp("\(\s*([0-9.-] )\s*,\s([0-9.-] )\s*\)", "g");
(и я думаю, теперь вы понимаете, почему литералы регулярных выражений более удобны)
Я всегда нахожу полезным скопировать и пропустить RegExp
выражение в консоли и просмотреть его вывод. Принимая ваше первоначальное выражение, мы получаем:
/(s*([0-9.-] )s*,s([0-9.-] )s*)/g
это означает , что выражения пытаются совпадать /
, s
и g
буквально и парены ()
по-прежнему рассматриваются как специальные символы.
Обновление: .match()
возвращает массив:
["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ]
что, по-видимому, не очень полезно.
Вы должны использовать .exec()
[MDN] для извлечения чисел:
["(25.774252, -80.190262)", "25.774252", "-80.190262"]
Это необходимо вызывать повторно, пока не будут обработаны все строки.
Пример:
var reg = /(s*([0-9.-] )s*,s([0-9.-] )s*)/g;
var result, points = [];
while((result = reg.exec(polygons)) !== null) {
points.push([ result[1], result[2]]);
}
Это создает массив массивов, и унарный плюс (
) преобразует строки в числа:
[
[25.774252, -80.190262],
[18.466465, -66.118292],
...
]
Конечно, если вы хотите, чтобы значения были строками, а не числами, вы можете просто опустить
.
Комментарии:
1. Отлично, это сработало! Я не знал этого синтакса. Небольшой вопрос: я получаю массив с результатом, но как я могу получить содержимое моего захвата «(…)» ?(это: ([0-9.-] ) )
2. Я допустил ошибку, вы должны сохранить
g
модификатор. Вам просто нужно использоватьexec
. Пожалуйста, ознакомьтесь с исправленной версией.3. Хотя это довольно старый ответ, он помог мне завершить проверку формы. Дополнительная » «в». » сделала это в конце 🙂