Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.11.2011, 14:42
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

Регулярные выражения. Почему находи именно так?
Вот пример из учебника (http://javascript.ru/basic/regular-e...d-match-regexp)

str = "For more information, see Chapter 3.4.5.1";
re = /chapter (\d+(\.\d)*)/i;
found = str.match(re);
alert(found);

Выводит:

Chapter 3.4.5.1 - полностью совпавшая строка
3.4.5.1 - первая скобка
.1 - внутренняя скобка

Не понятен третий вариант. Почему именно .1, если в рег-выражении стоит (\.\d)? По идее под этот паттерн подходит и .4.5.1 и .1
Но выводит только .1 Почему?
Ответить с цитированием
  #2 (permalink)  
Старый 21.11.2011, 14:53
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Потому, что в этой скобке хранится последнее найденное совпадение.
Грубо говоря - (\.\d)* находит - ".4", и добавляет его в скобку (\d+(\.\d)*), потом находит ".5" (так как установлено повторение именно скобки) и добавляет его снова во внешнюю скобку. Потом точно так же с ".1" и так как это последнее значение найденное этой скобкой оно и сохраняется. Сделайте так, и увидите разницу:
str = "For more information, see Chapter 3.4.5.1";
re = /chapter (\d+((\.\d)*))/i;
found = str.match(re);
alert(found);
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
  #3 (permalink)  
Старый 21.11.2011, 15:34
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

Сообщение от Nekromancer Посмотреть сообщение
Потому...
Спасибо.

А подскажите еще по методу replace(). Вот есть инструкция (из того же урока):
var ab = "a b".replace("\\s","..") // = "a b"

Интересует, если в качестве первого параметра replace(первый, второй) подавать именно строку, он будет ее переводить сам в регулярное выражение или будет рассматривать именно как строку, без преобразования? Здесь в примере вроде не преобразует.
Ответить с цитированием
  #4 (permalink)  
Старый 21.11.2011, 15:37
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Он будет переводить строку в регулярное выражение, но все метасимволы будет экранировать. Т.е. в примере выше будет искаться строка \s, а не любой пробельный символ.
Ответить с цитированием
  #5 (permalink)  
Старый 21.11.2011, 15:37
Аватар для Nekromancer
Профессор
Отправить личное сообщение для Nekromancer Посмотреть профиль Найти все сообщения от Nekromancer
 
Регистрация: 06.05.2009
Сообщений: 1,163

Прямо из того же урока, из того же места, явно написано - строка не преобразуется в регулярное выражение. И показали вам пример, и вы сами увидели это.
Цитата:
Если первый аргумент - строка, то она не преобразуется в регулярное выражение, так что, например,
var ab = "a b".replace("\\s","..") // = "a b"

Вызов replace оставил строку без изменения, т.к искал не регулярное выражение \s, а строку "\s".
__________________
Нужно равняться на лучших, а не оправдываться за счёт худших.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему так получается? lukingnu jQuery 0 31.07.2010 15:50
выдача всех результатов. регулярные выражения andreevich Общие вопросы Javascript 4 12.05.2010 16:52
регулярные выражения php HelpeR Серверные языки и технологии 5 15.09.2009 21:09
Регулярные выражения вытаскивание по шаблону baal1988 Общие вопросы Javascript 27 09.10.2008 10:51
регулярные выражения в JS bifidokk Events/DOM/Window 2 02.06.2008 12:29