Шаблон регулярного выражения в RE2 для Apps Script

Вопрос или проблема

Я пытаюсь использовать функцию findText() класса DocumentApp, чтобы получить позицию некоторого текста внутри Google Docs. Для этого я использую регулярное выражение (RE2). Я хочу, чтобы оно находило следующие последовательности: $$anyCharacterHere$$; в основном, все, что заключено между $$ … $$. Поскольку таких последовательностей может быть несколько, нам нужно сказать регулярному выражению, чтобы оно соответствовало любой последовательности этого типа без каких-либо “$” внутри.

Я пробовал использовать следующее:

const re2 = new RegExp("\\$\\$.*(?!\\\$)\\$\\$");
let range = docBody.findText(re2)

но выдает ошибку, что это недопустимое выражение. Я пробовал изменять обратные слэши и подобные вещи, но не смог продвинуться дальше.

Цель, которую я хочу достичь, это, например, в этом тексте:

Это $$text$$, чтобы показать $example$$ того, как должен работать $$regex$$ $$$hould$$.

регулярное выражение должно находить: $$text$$ и $$regex$$.

Альтернативой, основанной на вашей “примерной строке”, может быть это;

function myFunction() {
  const doc = DocumentApp.getActiveDocument();
  const matches = doc
    .getBody()
    .getText()
    .match(/(^|\s)[$]{2}[^$\s]*[$]{2}/g);
  if (!matches || matches.length == 0) return;

  var out=[];

  for (var i=0; i<matches.length; i++){
    out.push(matches[i].trim())
  }

  Logger.log(out);
  }

Ответ или решение

Использование Regex в Google Apps Script для поиска текста в Google Docs

Вопрос, который вы подняли, касается возможности нахождения текстовых последовательностей, заключенных в двойные символы доллара ($$…$$) в документах Google Docs с использованием регулярных выражений (PE2). В данной статье мы обсудим, как корректно сформулировать регулярное выражение для данной задачи, а также приведем практический пример.

Задача

Наша цель — найти текстовые последовательности вида $$anyCharacterHere$$, избегая символов доллара внутри этих последовательностей. Например, в строке:

"Thi is a $$text$$ to show an $example$$ of how the $$regex$$ $$$hould$$ work."

Мы должны извлечь: $$text$$ и $$regex$$.

Проблема с регулярным выражением

Исходное регулярное выражение, которое вы использовали:

const re2 = new RegExp("\\$\\$.*(?!\\\$)\\$\\$");

это неверный подход по нескольким причинам:

  1. Неправильное выражение: Использование *`.`** захватывает любые символы, включая символы доллара, что противоречит вашей задаче.
  2. Неверная конструкция: FE2 (Regular Expressions в Google Apps Script) требует особого учета специальных символов и конструкций.

Правильное регулярное выражение

Для того чтобы найти все текстовые последовательности между двойными символами доллара без символов доллара внутри, мы можем использовать следующее регулярное выражение:

const re2 = new RegExp("\\$\\$([^\\$]*)\\$\\$");

Здесь конструкция *`([^\$])`** захватывает любые символы, кроме доллара, что позволяет избежать включения недопустимых символов.

Полный код

Опираясь на обновленное регулярное выражение, предлагаю следующий пример кода для поиска в документе Google:

function myFunction() {
  const doc = DocumentApp.getActiveDocument();
  const body = doc.getBody();
  const text = body.getText();

  // Используем обновленный regex
  const matches = text.match(/\$\$([^$]*)\$\$/g);

  if (!matches || matches.length === 0) return;

  const out = matches.map(match => match.trim());

  Logger.log(out);
}

Объяснение кода

  1. Получение документа: Получаем активный документ и его текст.
  2. Поиск совпадений: С помощью метода match() находим все текстовые последовательности, подходящие под регулярное выражение.
  3. Обработка результатов: Если находятся совпадения, они очищаются от лишних пробелов и выводятся в лог.

Заключение

Теперь, используя указанный метод и регулярное выражение, вы сможете эффективно находить текст внутри двойных символов доллара. Важно также помнить о том, что регулярные выражения могут потребовать дополнительных настроек в зависимости от уникальных требований вашего документа.

Если у вас будут дополнительные вопросы или понадобится помощь в доработке кода, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...