03.03.2015, 03:38
|
Новичок на форуме
|
|
Регистрация: 26.02.2015
Сообщений: 7
|
|
Разница между литеральной формой и объектом RegExp
Код:
|
var $eMail = 'blah-blah9@blah-blah-blah9.blahblahblah';
alert(($eMail.match(/^[-_a-z0-9\.]+@(?:[-_a-z0-9]+(?=\.)\.)+[a-z]{2,6}$/i)) === null);/ Выводит true
var $reg = new RegExp('^[-_a-z0-9\.]+@(?:[-_a-z0-9]+(?=\.)\.)+[a-z]{2,6}$', 'i');
alert(($eMail.match($reg) === null);/ Выводит false |
Регулярки в обоих случаях одинаковые, в документации везде пишут, что случай №1 - это сокращенная форма, а №2 - полная. Но работают, судя по всему, по разному.
Почему так? Может кто подскажет?
Ушатал из-за этой непонятной разницы целые сутки. Переписывал регулярку по разному (думал, что неправильно пишу регулярку), экспериментировал (с объектом RegExp) и никак не мог понять почему не работает, пока не переписал в виде литерала и все заработало.
|
|
03.03.2015, 04:11
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
new RegExp('^[-_a-z0-9\\.]+@(?:[-_a-z0-9]+(?=\\.)\\.)+[a-z]{2,6}$', 'i')
В конструкторе new RegExp обратные слеши надо экранировать.
Последний раз редактировалось laimas, 03.03.2015 в 04:14.
|
|
03.03.2015, 05:52
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от laimas
|
В конструкторе new RegExp обратные слеши надо экранировать.
|
Конструктор тут не причем. Дело в строках.
Чтобы сформировать в памяти строку abc\cde в исходном коде js нужно записать ее как 'abc\\cde'
<input
onchange="alert(new RegExp(dataset.pattern, 'i').test(value))"
data-pattern="^[-_a-z0-9\.]+@(?:[-_a-z0-9]+(?=\.)\.)+[a-z]{2,6}$"
value="blah-blah9@blah-blah-blah9."
/>
<form action="javascript:'ok'">
<input type="email" required />
<button type="submit">Попытаться отправить</button>
</form>
__________________
В личку только с интересными предложениями
|
|
03.03.2015, 05:57
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Получается, что нужно проверять входное значение и при необходимости экранировать?
|
|
03.03.2015, 06:33
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
laimas, в примере у меня email не дописан, поэтому выдает false.
Я просто показал, что строка может быть записана не в js-коде, а в html-коде, а по правилам html слэш не является спецсимволом. То есть дело не в конструкторе RegExp, а в правилах синтаксиса языка, на котором записывается строка.
__________________
В личку только с интересными предложениями
|
|
03.03.2015, 06:36
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Ну тогда понятно.
PS. danik.js ты же здесь дано обитаешь, должен быть в курсе. В общем попал я здесь на страницу, на которой описано форматирование сообщения - добавление [JS run], еще чего-то там... Была открыта эта страница, но Лиса подвисла и пришлось ее насильно отключить, последнее открытое не сохранилось. Все пытаюсь найти опять эту страницу форума и безуспешно, даже не представляю как на нее попал раньше. ) Дай ссылку на нее, пожалуйста.
Последний раз редактировалось laimas, 03.03.2015 в 07:19.
|
|
03.03.2015, 08:44
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
__________________
В личку только с интересными предложениями
|
|
03.03.2015, 09:09
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Благодарю, оно самое.
|
|
03.03.2015, 11:50
|
Новичок на форуме
|
|
Регистрация: 26.02.2015
Сообщений: 7
|
|
ОК, спасибо. Дело в том, что в статье о регулярках не встречал этой тонкости.
|
|
|
|