2013-05-15 31 views
6

Tôi đang sử dụng mẫu regex mà tôi lấy từ regexlib để xác thực các url tương đối. Trên trang web của họ, bạn có thể test mẫu để đảm bảo nó phù hợp với nhu cầu của bạn. Tất cả mọi thứ hoạt động tốt trên trang web của họ, ngay sau khi tôi sử dụng mô hình trong tôi, tôi nhận được thông báo lỗi:Phạm vi không hợp lệ của regex Javascript trong lớp nhân vật

phạm vi không hợp lệ trong lớp nhân vật

Tôi biết rằng lỗi này thường có nghĩa là một gạch nối là nhầm lẫn được sử dụng để đại diện cho một phạm vi và không được thoát đúng cách. Nhưng trong trường hợp này kể từ khi nó hoạt động trên trang web của họ, tôi bối rối tại sao nó không làm việc trên của tôi.

var urlRegex = new RegExp('^(?:(?:\.\./)|/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$', 'g'); 

LƯU Ý: Nếu bạn đang đi để kiểm tra regex từ trang web của họ (bằng cách sử dụng liên kết ở trên) hãy chắc chắn để thay đổi Regex Engine thả xuống để Client-side EngineEngine thả xuống để Javascript.

Trả lời

10

Hoặc đặt - tại cuối hoặc bắt đầu của lớp nhân vật hay sử dụng hai backslashes để làm một lối thoát regex trong chuỗi

kể từ khi bạn đang sử dụng chuỗi bạn cần phải sử dụng hai dấu chéo ngược cho mỗi ký tự đặc biệt ..


LƯU Ý

Check-out this câu trả lời trên SO điều này giải thích khi sử dụng backslashes đơn hoặc kép để thoát khỏi nhân vật đặc biệt

+0

tôi chuyển nó đến cuối trong cả hai lớp nhân vật nhưng bây giờ tôi nhận được 'quantifier' không hợp lệ – bflemi3

+0

không thể Tôi cũng tăng gấp đôi thoát khỏi gạch nối tức ('\\ -') thay vì di chuyển nó đến cùng? – bflemi3

+0

@ bflemi3 có thực sự bạn có thể thoát khỏi nó..kiểm tra liên kết tôi đã chỉ định trong ans – Anirudha

4

Không có lý do để sử dụng RegExp constructor đây. Chỉ cần sử dụng RegExp đen:

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 
      ^  ^^               ^                     ^

Bên RegExp đen, bạn chỉ cần viết regex một cách tự nhiên, ngoại trừ /, mà bây giờ cần thoát, vì / được sử dụng như delimiter trong RegExp chữ.

Trong lớp nhân vật, ^ có ý nghĩa đặc biệt ở phần đầu của lớp nhân vật, - có ý nghĩa đặc biệt ở giữa 2 nhân vật, và \ có ý nghĩa đặc biệt, mà là để thoát khỏi nhân vật khác (chủ yếu là ^, -, [, ]\) và cũng để chỉ định các lớp ký tự viết tắt (\d, \s, \w, ...). [, ] được sử dụng làm dấu phân tách cho lớp nhân vật, vì vậy chúng cũng có ý nghĩa đặc biệt. (Trên thực tế, trong JavaScript, chỉ ] có ý nghĩa đặc biệt và bạn có thể chỉ định [ mà không cần thoát trong lớp ký tự). Khác với 5 ký tự được liệt kê ở trên, các ký tự khác (trừ khi tham gia vào chuỗi thoát với \) không có bất kỳ ý nghĩa đặc biệt nào.

Bạn có thể giảm số lần thoát \ bằng thông tin ở trên. Đối với ^, trừ khi nó là ký tự duy nhất trong lớp nhân vật, bạn có thể đặt nó ra khỏi đầu lớp nhân vật. Đối với -, bạn có thể đặt nó ở cuối lớp nhân vật.

var urlRegex = /^(?:(?:\.\.\/)|\/)?(?:\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)?(?:\/\w(?:[\w`~!$=;+.^()|{}\[\]-]|(?:%\d\d))*\w?)*(?:\?[^#]+)?(?:#[a-z0-9]\w*)?$/g; 

gì đã được thay đổi:

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]] 
[\w`~!$=;+.^()|{}\[\]-] 
Các vấn đề liên quan