Почему это регулярное выражение javascript не работает?

#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. Хотя это довольно старый ответ, он помог мне завершить проверку формы. Дополнительная » «в». » сделала это в конце 🙂