Проблема не в лени;Ваше регулярное выражение является ленивым.Метод findText
возвращает RangeElement
, в котором содержится информация о начале и конце матча.Проблема в том, что вы вызываете getElement
для этого, который возвращает весь элемент, содержащий совпадение.Таким образом, результатом является весь абзац (или другой элемент), который содержит соответствующий текст.
Чтобы правильно извлечь соответствующий текст, используйте isPartial
, чтобы проверить, является ли совпадение только частью элемента;если это так, возьмите начальную и конечную позиции и нарежьте текст, как показано ниже.
function search() {
var body = DocumentApp.getActiveDocument().getBody();
var pattern = "<.*?>";
var found = body.findText(pattern);
while (found) {
var text = found.getElement().getText();
if (found.isPartial()) {
var start = found.getStartOffset();
var end = found.getEndOffsetInclusive();
text = text.slice(start, end+1);
}
Logger.log(text);
found = body.findText(pattern, found);
}
}
Примечания:
- В скрипте приложений конечное смещение включено;в
String.slice
методе это не так.Это причина для end+1
в slice
. - Цикл необходим для возврата всех результатов.
findText
находит только одно совпадение, которое здесь называется found
.Затем это совпадение передается в findText
в качестве второго параметра, чтобы найти следующее совпадение.