Все возможные совпадения регулярному выражению
Что-то я туплю и никак не пойму, как сделать, чтобы в следующем коде:
var str = "test test test", regexp = /test test/g;
while (regexp.exec(str)) {
alert(regexp.lastIndex);
}
было найдено 2 совпадения «test test»? Нужен именно exec в while, так как в каждой итерации используется lastIndex. |
var str = "test test test", regexp = /test(?= test)/g;
while (regexp.exec(str)) {
alert(regexp.lastIndex);
}
? |
Не получится так сделать, паттерн регулярного выражения из произвольного текста формируется, вложенные конструкции (?=) не будут же работать? И 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");
|
А вот такое не может пойти?
var str = "test test test", regexp = /test test/g;
while (regexp.exec(str)) {
alert(regexp.lastIndex);
/* что-нибудь полезное */
regexp.lastIndex -= (RegExp['$&'].length - 1)
}
|
Цитата:
|
Цитата:
В опере 9 такого нет,
alert( [/\d/.test('some text with 5 number'), RegExp.lastMatch, RegExp['$&']] );
|
Ну, или так.
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)
}
Надеюсь, общая мысль, без частности решения, понятна. |
Спасибо. Сделаю при помощи изменения lastIndex.
|
Проверял поддержку RegExp.lastMatch в Opera, заработало в версии 10.53, в 10.10 нет, значит, скорее всего поддержку ввели в версии 10.50.
|
| Часовой пояс GMT +3, время: 10:37. |