Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Разница между литеральной формой и объектом RegExp (https://javascript.ru/forum/misc/54087-raznica-mezhdu-literalnojj-formojj-i-obektom-regexp.html)

Вячеслав Александрович 03.03.2015 03:38

Разница между литеральной формой и объектом 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) и никак не мог понять почему не работает, пока не переписал в виде литерала и все заработало.

laimas 03.03.2015 04:11

new RegExp('^[-_a-z0-9\\.]+@(?:[-_a-z0-9]+(?=\\.)\\.)+[a-z]{2,6}$', 'i')

В конструкторе new RegExp обратные слеши надо экранировать.

danik.js 03.03.2015 05:52

Цитата:

Сообщение от 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>

laimas 03.03.2015 05:57

Получается, что нужно проверять входное значение и при необходимости экранировать?

danik.js 03.03.2015 06:33

laimas, в примере у меня email не дописан, поэтому выдает false.

Я просто показал, что строка может быть записана не в js-коде, а в html-коде, а по правилам html слэш не является спецсимволом. То есть дело не в конструкторе RegExp, а в правилах синтаксиса языка, на котором записывается строка.

laimas 03.03.2015 06:36

Ну тогда понятно.

PS. danik.js ты же здесь дано обитаешь, должен быть в курсе. В общем попал я здесь на страницу, на которой описано форматирование сообщения - добавление [JS run], еще чего-то там... Была открыта эта страница, но Лиса подвисла и пришлось ее насильно отключить, последнее открытое не сохранилось. Все пытаюсь найти опять эту страницу форума и безуспешно, даже не представляю как на нее попал раньше. ) Дай ссылку на нее, пожалуйста.

danik.js 03.03.2015 08:44

Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

laimas 03.03.2015 09:09

Благодарю, оно самое.

Вячеслав Александрович 03.03.2015 11:50

ОК, спасибо. Дело в том, что в статье о регулярках не встречал этой тонкости.


Часовой пояс GMT +3, время: 05:05.