Javascript + регулярний вираз = Помилка не повторюється?


82

Я новачок у Regex, і намагаюся переробити його в один зі своїх нових проектів, щоб побачити, чи зможу я навчитися і додати його до свого репертуару навичок. Однак я тут натрапляю на блокпост.

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

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

Однак, коли я намагаюся виконати функцію, яка міститься в цьому рядку, вона видає таку помилку для цього конкретного рядка:

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

]/: Nothing to repeat

Я не можу протягом усього життя зрозуміти, що не так з моїм кодом. Хтось може вказувати мені в правильному напрямку?

Відповіді:


113

Вам потрібно подвоїти зворотні скісні риски, використовувані для виходу зі спеціальних символів регулярного виразу. Однак, як зазначає @Bohemian, більшість цих зворотних скісних рисок не потрібні. На жаль, його відповідь страждає від тієї ж проблеми, що і ваша. Що ви насправді хочете:

Коса коса риса інтерпретується кодом, який читає рядок, а не передається аналізатору регулярних виразів. Ти хочеш:

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

Зверніть увагу на чотирикратну зворотну косу риску. Це однозначно потрібно. Тоді рядок, переданий компілятору регулярних виразів, ідентичний рядку @ Bohemian і працює коректно.


3
До речі, четверка \ потрібна лише в деяких мовах; напр. java так, perl ні
богемський

Дуже миттєвий момент, з яким я теж зіткнувся. Варто нагадати, що зворотна коса риса спочатку інтерпретується синтаксисом мови, а потім RegExp.
enorl76

8

На базі @Bohemian, я думаю, найпростішим підходом було б просто використовувати літерал регулярного виразу, наприклад:

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

Regex-літерали приємні, тому що вам не потрібно уникати символу втечі, а деякі IDE виділяють недійсні регулярні вирази (дуже корисно для мене, оскільки я постійно їх псую).


2

По-перше, у класі персонажів [...] більшості символів не потрібно втікати - це просто літерали.

Отже, ваш регулярний вираз повинен бути:

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

Це складається для мене.


@Icet, чи не відповідають вам інші відповіді? Якщо ні, то який вхідний сигнал "не працює"?
Богемський

Наприклад, +44 як вхід не працює. Це рішення чудово працює str.replace (/ [\ - [] \ / \ {\} () * \ + \? \. \\\ ^ \ $ \ |] / g, "\\ $ &");
Айст

0

Для мандрівників Google: це дурно безцільне повідомлення про помилку також відображається, коли ви створюєте тип і подвоюєте +оператор регулярного виразу:

Добре:

\w+

Не гаразд:

\w++

-1

Ну, у моєму випадку мені довелося перевірити номер телефону за допомогою регулярного виразу, і я отримав ту ж помилку,

Invalid regular expression: /+923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/: Nothing to repeat'

Отже, в чому була помилка в моєму випадку, це те, що +оператор після /початку регулярного виразу. Отож, огороджуючи +оператора квадратними дужками [+]та знову надсилаючи запит, це спрацювало як шарм.

Працюватиме наступне:

/[+]923[0-9]{2}-(?!1234567)(?!1111111)(?!7654321)[0-9]{7}/

Ця відповідь може бути корисною для тих, хто отримав такий самий тип помилки, але їх шанси отримати помилку з цієї точки зору, як моя! На ура :)


Чому ви просто не уникли символу плюса, замість того, щоб повністю його перемістити ...? ( \+)
esqew

Дякую, що дали мені зрозуміти ще одне @esqew, але я отримав інше рішення :)
Aneeq Ahmad
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.