Javascript + Regex = Нечего повторять ошибку?
Я новичок в Regex, и я пытаюсь использовать его в одном из моих новых проектов, чтобы узнать, могу ли я его изучить и добавить в свой репетитор навыков. Тем не менее, я нахожусь на контрольно-пропускном пункте.
Я пытаюсь понять, имеет ли пользователь ввод неправильных символов в нем, используя функцию .search
так:
if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
...
}
Однако, когда я пытаюсь выполнить функцию, содержащую эту строку, она выдает следующую ошибку для этой конкретной строки:
Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.
]/: Nothing to repeat
Я не могу на всю жизнь понять, что случилось с моим кодом. Может ли кто-нибудь указать мне в правильном направлении?
Ответы
Ответ 1
Вам нужно удвоить обратную косую черту, чтобы избежать специальных символов регулярного выражения. Однако, как указывает @Bohemian, большинство этих обратных косых черт не нужны. К сожалению, его ответ страдает от той же проблемы, что и ваша. Вы действительно хотите:
Обратная косая черта интерпретируется кодом, который читает строку, а не передается парсеру регулярных выражений. Вы хотите:
"[\\[\\]?*+|{}\\\\()@.\n\r]"
Обратите внимание на четырехкратную обратную косую черту. Это определенно необходимо. Строка, передаваемая компилятору регулярных выражений, затем идентична строке @Bohemian и работает правильно.
Ответ 2
Создавая @Bohemian, я думаю, что самым простым подходом было бы просто использовать литерал регулярного выражения, например:
if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) {
// ... stuff ...
}
Литералы регулярных выражений хороши, потому что вам не нужно избегать escape-символа, а некоторые IDE выделяют недопустимое регулярное выражение (очень полезное для меня, поскольку я постоянно их закручиваю).
Ответ 3
Во-первых, в символьном классе [...]
большинству символов не требуется экранирование - они просто литералы.
Итак, ваше регулярное выражение должно быть:
"[\[\]?*+|{}\\()@.\n\r]"
Это компилируется для меня.