Регулярные выражения. Почему находи именно так?
Вот пример из учебника (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 Почему? |
Потому, что в этой скобке хранится последнее найденное совпадение.
Грубо говоря - (\.\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); |
Цитата:
А подскажите еще по методу replace(). Вот есть инструкция (из того же урока): var ab = "a b".replace("\\s","..") // = "a b" Интересует, если в качестве первого параметра replace(первый, второй) подавать именно строку, он будет ее переводить сам в регулярное выражение или будет рассматривать именно как строку, без преобразования? Здесь в примере вроде не преобразует. |
Он будет переводить строку в регулярное выражение, но все метасимволы будет экранировать. Т.е. в примере выше будет искаться строка \s, а не любой пробельный символ.
|
Прямо из того же урока, из того же места, явно написано - строка не преобразуется в регулярное выражение. И показали вам пример, и вы сами увидели это.
Цитата:
|
Часовой пояс GMT +3, время: 03:39. |