Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Криво обрабатывается простая регулярка в JavaScript (https://javascript.ru/forum/misc/30185-krivo-obrabatyvaetsya-prostaya-regulyarka-v-javascript.html)

xintrea 27.07.2012 01:48

Криво обрабатывается простая регулярка в JavaScript
 
Вот простой пример:

text='<span class="bold js-clone-url-permission">Read+Write</span> access';
searchPattern="(.*)";
replacePattern="До $1 После";
      
result=text.replace(new RegExp(searchPattern,'g'), replacePattern);

alert( result );


Результат:

Код:

До <span class="bold js-clone-url-permission">Read+Write</span> access ПослеДо  После
Вопрос: Почему До После попадает в результат дважды?


Проверено на Firefox 14, Opera 12.

oneguy 27.07.2012 01:55

Потому что регулярка /(.*)/ ловит пустую строку после того, как словила всю исходную строку, и lastIndex передвинулся в конец.

xintrea 27.07.2012 09:20

О, это классно придумано.

xintrea 27.07.2012 09:23

Цитата:

Сообщение от oneguy (Сообщение 191974)
Потому что регулярка /(.*)/ ловит пустую строку после того, как словила всю исходную строку, и lastIndex передвинулся в конец.

А почему она ловит пустую строку? Я в регулярке вижу только выборку всей строки.

Deff 27.07.2012 09:42

xintrea,
Приведите Примеры: для пары Вариантов
входных строк и преобразованных строк на выходе, *это проще чем объяснять долго и нудно

xintrea 27.07.2012 11:27

Цитата:

Сообщение от Deff (Сообщение 191987)
xintrea,
Приведите Примеры: для пары Вариантов
входных строк и преобразованных строк на выходе, *это проще чем объяснять долго и нудно

Не знаю о каких вариантах вы говорите.

Лучше объясните, где в регулярке /(.*)/ вторая выборка?

oneguy 27.07.2012 16:48

Цитата:

Сообщение от xintrea (Сообщение 191984)
А почему она ловит пустую строку? Я в регулярке вижу только выборку всей строки.

Символ * в регулярке означает повторить подвыражение 0 или более количество раз. Данном случае выражение . (точка) повторилось 0 раз, и .* словило пустую строку. Если подвыражение нужно повторить 1 или более раз, то следует использовать символ + (плюс).
Например, если использовать регулярку на пустой строке
alert(JSON.stringify("".match(/(.*)/g)));

то получается 1 выборка - пустая строка.
В вашем случае получается 2 выборки - вся исходная строка и пустая подстрока с индекса, равному длине исходной строки.
alert(JSON.stringify('<span class="bold js-clone-url-permission">Read+Write</span> access'.match(/(.*)/g)));

xintrea 28.07.2012 10:46

Цитата:

Сообщение от oneguy (Сообщение 192108)
В вашем случае получается 2 выборки - вся исходная строка и пустая подстрока с индекса, равному длине исходной строки.
alert(JSON.stringify('<span class="bold js-clone-url-permission">Read+Write</span> access'.match(/(.*)/g)));

Предположим. А почему пустая строка находится в конце строки, а не, скажем, в начале?

Aetae 28.07.2012 11:32

Потому что * по умолчанию жаден, т.е берёт от жизни всё.
Иначе и такой вариант возможен:
text='<span class="bold js-clone-url-permission">Read+Write</span> access';
replacePattern="До $1 После";
      
result=text.replace(/(.*?)/g, replacePattern);
alert( result );


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