Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.07.2012, 01:48
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Криво обрабатывается простая регулярка в 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.

Последний раз редактировалось xintrea, 27.07.2012 в 09:20.
Ответить с цитированием
  #2 (permalink)  
Старый 27.07.2012, 01:55
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

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

Последний раз редактировалось oneguy, 27.07.2012 в 01:58.
Ответить с цитированием
  #3 (permalink)  
Старый 27.07.2012, 09:20
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

О, это классно придумано.
Ответить с цитированием
  #4 (permalink)  
Старый 27.07.2012, 09:23
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Сообщение от oneguy Посмотреть сообщение
Потому что регулярка /(.*)/ ловит пустую строку после того, как словила всю исходную строку, и lastIndex передвинулся в конец.
А почему она ловит пустую строку? Я в регулярке вижу только выборку всей строки.
Ответить с цитированием
  #5 (permalink)  
Старый 27.07.2012, 09:42
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

xintrea,
Приведите Примеры: для пары Вариантов
входных строк и преобразованных строк на выходе, *это проще чем объяснять долго и нудно
Ответить с цитированием
  #6 (permalink)  
Старый 27.07.2012, 11:27
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

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

Лучше объясните, где в регулярке /(.*)/ вторая выборка?
Ответить с цитированием
  #7 (permalink)  
Старый 27.07.2012, 16:48
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от xintrea Посмотреть сообщение
А почему она ловит пустую строку? Я в регулярке вижу только выборку всей строки.
Символ * в регулярке означает повторить подвыражение 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)));

Последний раз редактировалось oneguy, 27.07.2012 в 17:00.
Ответить с цитированием
  #8 (permalink)  
Старый 28.07.2012, 10:46
Аспирант
Отправить личное сообщение для xintrea Посмотреть профиль Найти все сообщения от xintrea
 
Регистрация: 02.01.2011
Сообщений: 56

Сообщение от oneguy Посмотреть сообщение
В вашем случае получается 2 выборки - вся исходная строка и пустая подстрока с индекса, равному длине исходной строки.
alert(JSON.stringify('<span class="bold js-clone-url-permission">Read+Write</span> access'.match(/(.*)/g)));
Предположим. А почему пустая строка находится в конце строки, а не, скажем, в начале?
Ответить с цитированием
  #9 (permalink)  
Старый 28.07.2012, 11:32
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,589

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга: JavaScript. Сильные стороны Magneto Учебные материалы 16 21.04.2013 15:28
Простая функция JavaScript. Задержка показа контента Mr.V Элементы интерфейса 2 11.08.2011 19:32
Последние книги по JavaScript! monolithed Учебные материалы 7 26.10.2010 19:40
Выдвет ошибку JavaScript Ромио Opera, Safari и др. 4 21.10.2010 20:34
Регулярка не должна воспринимать текст JavaScript в теге Script alexKniaz Общие вопросы Javascript 5 30.10.2009 21:59