Все возможные совпадения регулярному выражению
Что-то я туплю и никак не пойму, как сделать, чтобы в следующем коде:
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:26. |