Вопрос или проблема
Я пытаюсь использовать функцию 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("\\$\\$.*(?!\\\$)\\$\\$");
это неверный подход по нескольким причинам:
- Неправильное выражение: Использование *`.`** захватывает любые символы, включая символы доллара, что противоречит вашей задаче.
- Неверная конструкция: 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);
}
Объяснение кода
- Получение документа: Получаем активный документ и его текст.
- Поиск совпадений: С помощью метода
match()
находим все текстовые последовательности, подходящие под регулярное выражение. - Обработка результатов: Если находятся совпадения, они очищаются от лишних пробелов и выводятся в лог.
Заключение
Теперь, используя указанный метод и регулярное выражение, вы сможете эффективно находить текст внутри двойных символов доллара. Важно также помнить о том, что регулярные выражения могут потребовать дополнительных настроек в зависимости от уникальных требований вашего документа.
Если у вас будут дополнительные вопросы или понадобится помощь в доработке кода, не стесняйтесь обращаться!