Хорошо, вы исправили синтаксис JavaScript, теперь давайте поговорим о синтаксисе regex .Двоеточие (:
) не имеет особого значения, поэтому нет необходимости избегать его.Точка (.
) и вопросительный знак (?
) обычно имеют специальные значения, но не в том случае, если они появляются в классе символов (т. Е. В квадратных скобках).
Дефис (-
) имеет особое значение в классе символов: он образует диапазоны, например [a-z]
и [0-9]
.Если вы хотите включить буквальный дефис в класс символов, вы можете либо экранировать его обратной косой чертой, либо поместить его в начало или конец списка.Например, в [a-zA-Z0-9\.-]
последний дефис соответствует дефису, а остальные три используются для формирования диапазонов.(Обратная косая черта перед точкой не нужна, но она ничему не вредит.)
Теперь посмотрите на [a-zA-Z0-9%:/-_\?\.'~]
.Обратные слеши перед ?
и .
просто беспорядочные, но этот дефис является реальной проблемой.Он формирует диапазон, начинающийся с /
и заканчивающийся _
;если вы посмотрите на карту символов ASCII, то увидите, что она включает цифры 0-9
и заглавные буквы A-Z
, плюс
/
, :
, ;
, <
, =
, >
, ?
, @
, [
, \
, ]
, ^
, _
... явно не то, что авторпредназначена.В этом регулярном выражении также много ненужной группировки и дублирующегося кода, и вам действительно нужно сопоставлять IP-адреса?Мораль такова: не верь ничему, что найдешь на RegExLib.com.