Да, просто замени весь шаблон на этот:
|

14.07.2010, 06:00
|
|
|
Регистрация: 09.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.
|
|

14.07.2010, 06:08
|
 |
⊞ Развернуть
|
|
Регистрация: 11.01.2010
Сообщений: 1,810
|
|
var str = "test test test", regexp = /test(?= test)/g;
while (regexp.exec(str)) {
alert(regexp.lastIndex);
}
?
|
|

14.07.2010, 06:32
|
|
|
Регистрация: 09.07.2008
Сообщений: 3,873
|
|
Не получится так сделать, паттерн регулярного выражения из произвольного текста формируется, вложенные конструкции (?=) не будут же работать? И lastIndex нужен для конца подстроки, а не найденной части до (?=). Придется посимвольно перебирать?
var finder = {
escape: function (str) {
return str.replace(/([?!^$.(){}:|=[\]+\-\/\\*])/g, "\\$1");
},
createSearchPattern: function (text) {
// В некоторых браузерах неразрывный пробел ( или \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 в 06:48.
|
|

14.07.2010, 10:09
|
 |
Пионэр
|
|
Регистрация: 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)
}
|
|

14.07.2010, 11:43
|
 |
Рассеянный профессор
|
|
Регистрация: 06.04.2009
Сообщений: 2,379
|
|
что-то новенькое. Что это?
|
|

14.07.2010, 11:46
|
 |
⊞ Развернуть
|
|
Регистрация: 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 в 11:50.
|
|

14.07.2010, 13:24
|
 |
Пионэр
|
|
Регистрация: 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)
}
Надеюсь, общая мысль, без частности решения, понятна.
|
|

14.07.2010, 18:39
|
|
|
Регистрация: 09.07.2008
Сообщений: 3,873
|
|
|
Спасибо. Сделаю при помощи изменения lastIndex.
|
|

15.07.2010, 04:51
|
|
|
Регистрация: 09.07.2008
Сообщений: 3,873
|
|
|
Проверял поддержку RegExp.lastMatch в Opera, заработало в версии 10.53, в 10.10 нет, значит, скорее всего поддержку ввели в версии 10.50.
|
|
| Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
| глюк форума |
Gvozd |
Сайт Javascript.ru |
11 |
18.03.2009 13:37 |
|
|
|