#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 что, если я использую
/
inpreview.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
(многострочный).