Извлеките все теги из Документа Google, используя ленивое регулярное выражение - PullRequest
0 голосов
/ 11 мая 2018

У меня есть документ Google Docs, содержащий строку <dear> <person>, и я хочу, чтобы FindText возвращал один тег за раз.Я использую эту строку:

Logger.log(body.findText("<.*?>").getElement().getText());

И она записывает <dear> <person> вместо просто <dear>.Я думаю, что по какой-то причине сопоставление не работает в режиме «ленивый», но я запустил его на https://regex101.com, и он показывает два тега как два разных совпадения.

Что я делаю неправильно?

1 Ответ

0 голосов
/ 11 мая 2018

Проблема не в лени;Ваше регулярное выражение является ленивым.Метод 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 в качестве второго параметра, чтобы найти следующее совпадение.
...