2011-09-15 42 views
7

Tôi đang làm một phương pháp javascript nhỏ, nhận được một danh sách các điểm, và tôi đã đọc những điểm đó để tạo ra một Polygon trong một bản đồ google.Tại sao regex javascript này không hoạt động?

tôi nhận được những điểm trên biểu mẫu:

(lat, dài), (lat, dài), (lat, dài)

Vì vậy, tôi đã thực hiện các regex sau:

\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\) 

tôi đã thử nghiệm nó với RegexPal và các dữ liệu chính xác tôi nhận:

(25.774252, -80.190262),(18.466465, -66.118292),(32.321384, -64.75737),(25.774252, -80.190262) 

và nó hoạt động , vậy tại sao khi tôi đã mã này trong javascript của tôi, tôi nhận được null trong kết quả?

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); 

Tôi không gặp lỗi javascript khi thực hiện (với chế độ gỡ lỗi của google chrome). Mã này được lưu trữ trong một hàm javascript nằm trong tệp JS được bao gồm. Phương thức này được gọi trong phương thức OnLoad.

Tôi đã tìm kiếm rất nhiều, nhưng tôi không thể tìm thấy lý do tại sao tính năng này không hoạt động. Cảm ơn nhiều!

Trả lời

14

Sử dụng một regex literal [MDN]:

var reg = /\(\s*([0-9.-]+)\s*,\s([0-9.-]+)\s*\)/g; 

Bạn đang làm cho hai lỗi khi bạn sử dụng RegExp[MDN]:

  • Các "delimiters" / không phải là một phần của biểu thức
  • Nếu bạn xác định một biểu thức dưới dạng chuỗi, bạn phải thoát dấu gạch chéo ngược, bởi vì nó là ký tự thoát trong chuỗi

Ngoài ra, các công cụ sửa đổi được chuyển làm đối số thứ hai cho hàm.

Vì vậy, nếu bạn muốn sử dụng RegExp (mà bạn không cần phải trong trường hợp này), tương đương sẽ là:

var reg = new RegExp("\\(\\s*([0-9.-]+)\\s*,\\s([0-9.-]+)\\s*\\)", "g"); 

(và tôi nghĩ rằng bây giờ bạn thấy tại sao literals regex là thuận tiện hơn)


Tôi luôn thấy hữu ích khi sao chép và qua biểu thức RegExp trong bảng điều khiển và xem kết quả của nó. Lấy biểu hiện ban đầu của bạn, chúng tôi nhận được:

/(s*([0-9.-]+)s*,s([0-9.-]+)s*)/g 

có nghĩa là các biểu thức cố gắng để phù hợp với /, sg nghĩa đen và Parens () vẫn được đối xử nhân vật đặc biệt.


Cập nhật:.match() trả về một mảng:

["(25.774252, -80.190262)", "(18.466465, -66.118292)", ... ] 

mà dường như không thể rất hữu ích.

Bạn phải sử dụng .exec()[MDN] để trích xuất các con số:

["(25.774252, -80.190262)", "25.774252", "-80.190262"] 

này có được gọi là lặp đi lặp lại cho đến khi toàn bộ chuỗi được xử lý.

Ví dụ:

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]]); 
} 

Điều này tạo ra một mảng của mảng và các toán tử cộng (+) sẽ chuyển đổi chuỗi thành số:

[ 
    [25.774252, -80.190262], 
    [18.466465, -66.118292], 
    ... 
] 

Tất nhiên nếu bạn muốn các giá trị như dây đàn và không phải là số, bạn chỉ có thể bỏ qua +.

+1

Tuyệt vời, nó hoạt động! Tôi không biết synthax này. Câu hỏi nhỏ: Tôi nhận được một mảng với kết quả, nhưng làm thế nào tôi có thể lấy lại nội dung của việc chụp của tôi "(...)"? (Điều này: ([0-9 .-] +)) – J4N

+1

Vui lòng xem cập nhật của tôi. –

+1

cảm ơn bạn rất nhiều, những gì tôi cần – J4N

Các vấn đề liên quan