Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Регулярные выражения. Почему находи именно так? (https://javascript.ru/forum/misc/23363-regulyarnye-vyrazheniya-pochemu-nakhodi-imenno-tak.html)

jsuse 21.11.2011 15:42

Регулярные выражения. Почему находи именно так?
 
Вот пример из учебника (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 Почему?

Nekromancer 21.11.2011 15:53

Потому, что в этой скобке хранится последнее найденное совпадение.
Грубо говоря - (\.\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);

jsuse 21.11.2011 16:34

Цитата:

Сообщение от Nekromancer (Сообщение 138127)
Потому...

Спасибо.

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

Интересует, если в качестве первого параметра replace(первый, второй) подавать именно строку, он будет ее переводить сам в регулярное выражение или будет рассматривать именно как строку, без преобразования? Здесь в примере вроде не преобразует.

Kolyaj 21.11.2011 16:37

Он будет переводить строку в регулярное выражение, но все метасимволы будет экранировать. Т.е. в примере выше будет искаться строка \s, а не любой пробельный символ.

Nekromancer 21.11.2011 16:37

Прямо из того же урока, из того же места, явно написано - строка не преобразуется в регулярное выражение. И показали вам пример, и вы сами увидели это.
Цитата:

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

Вызов replace оставил строку без изменения, т.к искал не регулярное выражение \s, а строку "\s".


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