Недавно я начал использовать регулярное выражение проверки подлинности электронной почты из плагина JQuery validation в моделях Rails.Регулярное выражение плохо работает в Ruby по сравнению с JavaScript
EMAIL_REGEXP=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i
"[email protected]".match EMAIL_REGEXP # returns immidiately
"[email protected]".match EMAIL_REGEXP # takes a long time
Регулярное выражение занимает много времени, когда недействительный адрес электронной почты имеет много точек, разделенные лексемы (например: [email protected]). То же выражение works without любая заметная задержка в JavaScript.
Почему существует такая разница в производительности между парсерами регулярного выражения Ruby и JavaScript? Есть ли что-то, что я могу сделать, чтобы улучшить время отклика?
Я на рубине 1.8.7. Я не вижу такой же проблемы в Ruby 1.9.2.
Примечание
Я знаю, что р-ехр долго. Поскольку он используется jQuery, я думал об использовании его. Я всегда могу изменить его на более простое регулярное выражение, как показано на рисунке here. Мой вопрос в основном заключается в выяснении причины того, что одно и то же регулярное выражение намного быстрее в JS.
Ссылка:
JQuery Validation Plugin Source
Sample form with jQuery email validation
Это одно огромное регулярное выражение. Почему вы не используете парсер электронной почты? – Blender
@ Качество комментариев в комментарии будет значительно улучшаться, если вы предоставили ссылку – tekknolagi
Ну, это регулярное выражение взято из официального плагина 'jQuery' и широко используется. Поэтому я подумал, что это безопасный маршрут. Я могу пойти по пути пользовательской проверки, если я не могу заставить RegExp работать. –