2013-05-15 3 views
6

Я использую шаблон регулярного выражения, который я получил из regexlib для проверки относительных URL-адресов. На их сайте вы можете test шаблон, чтобы убедиться, что он соответствует вашим потребностям. Все отлично работает на своем сайте, как только я использую шаблон в шахте я получаю сообщение об ошибке:Javascript regex недопустимый диапазон в классе символов

Недопустимый диапазон в классе символов

Я знаю, что эта ошибка обычно означает, что дефис ошибочно используется для представления диапазона и не экранируется должным образом. Но в этом случае, поскольку он работает на их сайте, я смущен, почему он не работает на моем.

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

ПРИМЕЧАНИЕ: Если вы собираетесь тестировать регулярное выражение с их сайта (используя ссылку выше) убедитесь, что изменить Regex Engine Выпадающий Client-side Engine и Engine раскрывающегося списка Javascript.

ответ

10

Либо ставить - на конце или начиная класса символов или использовать две обратные косые сделать регулярное выражение побег в строки

, так как вы используете строку, нужно использовать две обратные косые черты для каждого специального символа ..


ПРИМЕЧАНИЕ

Заканчивать this ответ на SO, который объясняет, когда использовать один или два раза подряд, чтобы экранировать специальные символы

+0

Я перенес ее в конце концов в обоих классах символов, но теперь я получаю 'Invalid quantifier' – bflemi3

+0

не мог я также удвоит избежать дефис, т.е. (' \\ -') вместо того, чтобы переместить его до конца? – bflemi3

+0

@ bflemi3 да, действительно, вы можете сбежать от него. Посмотрите ссылку, указанную в анде – Anirudha

4

Там нет оснований использовать RegExp конструктор здесь. Просто используйте RegExp буквальным:

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

Внутри RegExp буквальным, вы просто написать регулярное выражение, естественно, для /, которая теперь нуждается в побег, за исключением, так как / используется в качестве разделителя в RegExp буквальным.

В классе символов, ^ имеет особое значение в начале класса символов, - имеет особое значение в между 2 символов и \ имеет особое значение, которое, чтобы избежать других персонажей (в основном ^, -, [, ] и \), а также указать классы сокращенных символов (\d, \s, \w, ...). [, ] используются как разделители для класса символов, поэтому они также имеют особое значение. (На самом деле, в JavaScript только ] имеет особое значение, и вы можете указать [ без экранирования внутри класса символов). Помимо перечисленных выше 5 символов, другие символы (если они не участвуют в escape-последовательности с \), не имеют особого значения.

Вы можете уменьшить количество побегов \ с приведенной выше информацией. Для ^, если только он не является единственным символом в классе символов, вы можете удалить его с начала класса символов. Для - вы можете поместить его в конец класса символов.

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

Что было изменено:

[\w`~!$=;\-\+\.\^\(\)\|\{\}\[\]] 
[\w`~!$=;+.^()|{}\[\]-] 
Смежные вопросы