Ошибка создания регулярного выражения Javascript

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть следующий код JavaScript:

 aw_check_custom_validation['my-phone'] = /^ [0-9]{1,3}(s[0-9]{1,6}s|([0-9]{1,6})|[0-9]{1,6})[0-9s]{5,8}$/u;
  

и я получаю следующую ошибку:

 Uncaught SyntaxError: Invalid flags supplied to RegExp constructor 'u'
  

Почему флаг /u вызывает эту ошибку?

Комментарии:

1. чего вы ожидали от / u?

2. Потому что единственными допустимыми флагами являются i , m и g : developer.mozilla.org/en/JavaScript/Reference/Global_Objects /…

Ответ №1:

Что ж, /u флаг зависит от PHP и включает поддержку Unicode (которую ваше регулярное выражение в любом случае не использует, если вы не планируете сопоставлять пробельные символы Unicode с s сокращением). Почему бы просто не удалить его?

Для справки, JavaScript поддерживает только модификаторы /g /i (глобальное сопоставление), /m (сопоставление без учета регистра) и ^ (многострочный, т.е. разрешающий $ и,, совпадать в начале и конце каждой строки).

Комментарии:

1. @32bitkid: Возможно, но регулярным выражениям JavaScript катастрофически не хватает поддержки Unicode. Кроме отдельных кодовых точек ( u1234 ), там не так много. w например, соответствует только символам ASCII; в Unicode нет поддержки скриптов / блоков / свойств ( p{L} и т.д.) и так далее…

2. @TimPietzcker что, если я использую / in preview.replace(/[ul](. )[/ul]/mg, ul_list); вместо ^ и $ ? /m для этого не работает. Можете ли вы помочь мне с этим?

3. @TimPietzcker Прошу прощения, вы можете мне ответить?

4. @flinth: Извините, я не вижу связи с этим вопросом. Если вы хотите задать новый вопрос, используйте кнопку «Задать вопрос» и укажите дополнительную информацию. Комментарии для этого не подходят.

5. В ECMAScript 2015 добавлена поддержка u флага JavaScript, поэтому u флаг доступен (и описан в документации) для конструктора регулярных выражений: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /… . Поддерживаются самые ранние версии браузера u : Chrome v.50, Firefox / Gecko v.46.

Ответ №2:

Это очень загадочное сообщение, которое означает, что u флаг, который вы передаете конструктору регулярных выражений, недействителен. JavaScript поддерживает;

  • g (глобальное совпадение)
  • m («Обрабатывать начальные и конечные символы (^ и $) как работающие в нескольких строках»)
  • i (совпадение без учета регистра)

Для получения дополнительной информации смотрите документацию MDC

Комментарии:

1. спасибо за объяснение! Я понимаю, что неправильно понимаю флаги регулярного выражения 🙂

2. В настоящее время (после нескольких лет ожидания) u флаг доступен (и описан в документации) для конструктора регулярных выражений: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /… в браузерах, поддерживающих ECMAScript 2015 (Chrome v.50, Firefox / Gecko v.46).

Ответ №3:

Не уверен, ваш это случай или нет, но у меня была аналогичная проблема с Node.js:

Ошибка синтаксиса: недопустимые флаги, предоставленные конструктору регулярных выражений ‘u’

Я исправил это, просто обновив Node.js на моем сервере Ubuntu. Предыдущая версия была:

 $ node -v
v5.1.1
  

Затем я сделал:

 $ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
   ... long output
$ sudo apt-get install -y nodejs
   ... shorter output
$ node -v
v6.7.0
  

И больше никаких проблем.

Ответ №4:

Потому что это недопустимый флаг регулярных выражений JavaScript; допустимыми флагами являются g (глобальный), i (игнорировать регистр) и m (многострочный).