Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 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) и никак не мог понять почему не работает, пока не переписал в виде литерала и все заработало.
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2015, 04:11
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 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.
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2015, 05:52
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 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>
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #4 (permalink)  
Старый 03.03.2015, 05:57
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Получается, что нужно проверять входное значение и при необходимости экранировать?
Ответить с цитированием
  #5 (permalink)  
Старый 03.03.2015, 06:33
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

Я просто показал, что строка может быть записана не в js-коде, а в html-коде, а по правилам html слэш не является спецсимволом. То есть дело не в конструкторе RegExp, а в правилах синтаксиса языка, на котором записывается строка.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2015, 06:36
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

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

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

Последний раз редактировалось laimas, 03.03.2015 в 07:19.
Ответить с цитированием
  #7 (permalink)  
Старый 03.03.2015, 08:44
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #8 (permalink)  
Старый 03.03.2015, 09:09
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Благодарю, оно самое.
Ответить с цитированием
  #9 (permalink)  
Старый 03.03.2015, 11:50
Новичок на форуме
Отправить личное сообщение для Вячеслав Александрович Посмотреть профиль Найти все сообщения от Вячеслав Александрович
 
Регистрация: 26.02.2015
Сообщений: 7

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разница между my_id и document.getElementById('my_id') js_explorer Events/DOM/Window 6 03.04.2013 17:53
Какая разница между модулями DOM Level 2 и интерфейсами Node? dump Общие вопросы Javascript 3 09.08.2012 17:22
Какая разница между post запросами jquery и ajax? Rooner jQuery 2 18.06.2012 14:29
Какая разница между определениями функций Nadine Общие вопросы Javascript 1 07.03.2012 16:07
Разница между (function(){})() и (function(){}()) ruzzx Общие вопросы Javascript 6 17.04.2011 22:51