Подтвердить что ты не робот

Javascript + Regex = Нечего повторять ошибку?

Я новичок в Regex, и я пытаюсь использовать его в одном из моих новых проектов, чтобы узнать, могу ли я его изучить и добавить в свой репетитор навыков. Тем не менее, я нахожусь на контрольно-пропускном пункте.

Я пытаюсь понять, имеет ли пользователь ввод неправильных символов в нем, используя функцию .search так:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) {
    ...
}

Однако, когда я пытаюсь выполнить функцию, содержащую эту строку, она выдает следующую ошибку для этой конкретной строки:

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.

]/: Nothing to repeat

Я не могу на всю жизнь понять, что случилось с моим кодом. Может ли кто-нибудь указать мне в правильном направлении?

4b9b3361

Ответ 1

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

Обратная косая черта интерпретируется кодом, который читает строку, а не передается парсеру регулярных выражений. Вы хотите:

"[\\[\\]?*+|{}\\\\()@.\n\r]"

Обратите внимание на четырехкратную обратную косую черту. Это определенно необходимо. Строка, передаваемая компилятору регулярных выражений, затем идентична строке @Bohemian и работает правильно.

Ответ 2

Создавая @Bohemian, я думаю, что самым простым подходом было бы просто использовать литерал регулярного выражения, например:

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) {
    // ... stuff ...
}

Литералы регулярных выражений хороши, потому что вам не нужно избегать escape-символа, а некоторые IDE выделяют недопустимое регулярное выражение (очень полезное для меня, поскольку я постоянно их закручиваю).

Ответ 3

Во-первых, в символьном классе [...] большинству символов не требуется экранирование - они просто литералы.

Итак, ваше регулярное выражение должно быть:

"[\[\]?*+|{}\\()@.\n\r]"

Это компилируется для меня.