Почему JSLint возвращает «плохой спуск» в этой строке кода? - PullRequest
9 голосов
/ 26 февраля 2010

Почему JSLint возвращает 'Bad escapeing' в следующей строке JavaScript?

param = param.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");

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

Регулярные выражения записываются в краткие и загадочные обозначения. JSLint ищет проблемы, которые могут вызвать проблемы переносимости. Это также пытается разрешить визуальные неоднозначности рекомендует явный спуск.

Синтаксис JavaScript для обычного Выражения литералы перегружают / персонаж. Чтобы избежать двусмысленности, JSLint ожидает, что персонаж, предшествующий литерал регулярного выражения является (или = или: или, символ.

1 Ответ

13 голосов
/ 26 февраля 2010

Это не регулярное выражение, на которое он жалуется. Вы заменяете символы в строках замены, которые вообще не нуждаются в экранировании.

Символы [и] не имеют специального значения в обычной строке, вам не нужно их экранировать:

param = param.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");

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

param = param.replace(/\[/,"\\[").replace(/\]/,"\\]");

Вы также можете сопоставить оба символа в одном регулярном выражении, поймать то, что соответствует, и использовать при замене. Если вы хотите заменить больше, чем первое вхождение, вы хотите использовать глобальную опцию:

param = param.replace(/(\[|\])/g,"\\$1");
...