Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.07.2010, 07:00
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Все возможные совпадения регулярному выражению
Что-то я туплю и никак не пойму, как сделать, чтобы в следующем коде:
var str = "test test test", regexp = /test test/g;
while (regexp.exec(str)) {
    alert(regexp.lastIndex);
}

было найдено 2 совпадения «test test»?

Нужен именно exec в while, так как в каждой итерации используется lastIndex.
Ответить с цитированием
  #2 (permalink)  
Старый 14.07.2010, 07:08
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

var str = "test test test", regexp = /test(?= test)/g;
while (regexp.exec(str)) {
    alert(regexp.lastIndex);
}
?
Ответить с цитированием
  #3 (permalink)  
Старый 14.07.2010, 07:32
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Не получится так сделать, паттерн регулярного выражения из произвольного текста формируется, вложенные конструкции (?=) не будут же работать? И lastIndex нужен для конца подстроки, а не найденной части до (?=). Придется посимвольно перебирать?

var finder = {
	escape: function (str) {
		return str.replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, "\\$1");
	},
	createSearchPattern: function (text) {
		// В некоторых браузерах неразрывный пробел (&nbsp; или \u00A0) не попадает под облать действия метасимвола \s.
		// todo проработать остальные символы perfectionkills.com/whitespace-deviations
		return this.escape(text).replace(/^[\s\u0A00]+|[\s\u0A00]+$/, "").split(/[\s\u0A00]+/).join("[\\s\\u00A0]+");
	},
	find: function (text, search) {
		var regexp = new RegExp(this.createSearchPattern(search), "g");
		while (regexp.exec(text)) {
			alert(regexp.lastIndex);
		}
	}
};

finder.find("text text text", "text text");

Последний раз редактировалось Octane, 14.07.2010 в 07:48.
Ответить с цитированием
  #4 (permalink)  
Старый 14.07.2010, 11:09
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

А вот такое не может пойти?
var str = "test test test", regexp = /test test/g;
while (regexp.exec(str)) {
    alert(regexp.lastIndex);
    /* что-нибудь полезное */
    regexp.lastIndex -= (RegExp['$&'].length - 1)
}
Ответить с цитированием
  #5 (permalink)  
Старый 14.07.2010, 12:43
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от subzey
$&
что-то новенькое. Что это?
Ответить с цитированием
  #6 (permalink)  
Старый 14.07.2010, 12:46
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от Riim
что-то новенькое. Что это?
lastMatch. Вся совпавшая строка.
В опере 9 такого нет, про 10-ку не знаю в 10.6 есть.
alert( [/\d/.test('some text with 5 number'), RegExp.lastMatch, RegExp['$&']] );

Последний раз редактировалось B@rmaley.e><e, 14.07.2010 в 12:50.
Ответить с цитированием
  #7 (permalink)  
Старый 14.07.2010, 14:24
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Ну, или так.
var str = "test test test", regexp = /test test/g;
var matches = [];
while (matches = regexp.exec(str)) {
    alert(regexp.lastIndex);
    /* что-нибудь полезное */
    regexp.lastIndex -= (matches[0].length - 1)
}
Надеюсь, общая мысль, без частности решения, понятна.
Ответить с цитированием
  #8 (permalink)  
Старый 14.07.2010, 19:39
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Спасибо. Сделаю при помощи изменения lastIndex.
Ответить с цитированием
  #9 (permalink)  
Старый 15.07.2010, 05:51
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Проверял поддержку RegExp.lastMatch в Opera, заработало в версии 10.53, в 10.10 нет, значит, скорее всего поддержку ввели в версии 10.50.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37