Как использовать текст из групп захвата в Google Docs Regex заменить?

12

Я пытаюсь сопоставить определенный текст, а затем заменить на текст плюс некоторые дополнительные символы. Минимальный пример текста:

#10 Oranges. These are citrus fruits

Желаемый вывод:

#10 Oranges. These are citrus fruits

Regex: (#\d{1,2}[^.]*\.)\s*

Заменить: $1\n

Match using regular expressionsпроверил)

Регулярное выражение успешно совпадает #10 Oranges.. Однако нумерованная обратная ссылка не заменяет текст группой захвата, а просто входит буквально (буквальный вывод - $1\n). Я также попытался использовать обратную косую черту для нумерованной обратной ссылки, \1и результат тот же.

Я что-то пропустил? Как заново вставить сопоставленный текст в документы Google с помощью регулярных выражений?

пользователь
источник
2
Теперь в документах прямо указано: Note: Capture groups only work with Google Sheets.см. Support.google.com/docs/answer/62754#regular_expressions
пользователь,

Ответы:

4

Короткий ответ

Вместо использования встроенной функции поиска и замены используйте Google Apps Script или надстройку.

объяснение

В функции «Найти и заменить» Документов Google часть «Заменить» не работает с регулярными выражениями и не работает ни с replaceText()методом из Сервиса документов в Сценарии Google Apps, к счастью, работает метод замены JavaScript.

Чтобы изучить основы создания простого скрипта, см. Https://developers.google.com/apps-script/overview.

Код

Этот код является адаптацией того, который включен в ссылку

function myFunction() {
  var body = DocumentApp.getActiveDocument().getBody();
  var paragraphs = body.getParagraphs();
  for (var i=0; i<paragraphs.length; i++) {
    var text = paragraphs[i].getText();
    paragraphs[i].replaceText(".*", 
       text.replace(/(\d{1,2}[^.]*\.)\s*/gi, '$1\n') );
  }
}

Ссылки

Рубена
источник
3
Я рассмотрю это, но является ли тот факт, что замена не работает с регулярным выражением, ошибка? Согласно этой документации, похоже, что она должна работать: support.google.com/docs/answer/62754#regular_expressions (см. Раздел Replace with regular expressions)
пользователь
2

Немного хакерский, но он не требует дополнительного добавления в скрипт и, вероятно, охватит 99% ваших случаев использования. Вы все еще можете использовать группы захвата с RegexReplaceи ссылку в тексте замены с $1или $2. Просто разделите свое регулярное выражение на две группы захвата и объедините с помощью случайного (редко используемого) символа, такого как ~. Затем вы можете взять из него все возвращаемое значение и заменить его ~на новую строку:

=SUBSTITUTE(REGEXREPLACE(A1,"(#\d{1,2}[^.]*\.)(\s*)","$1~$2"),"~",CHAR(10))

Скриншот

Для получения дополнительной информации о синтаксисе регулярных выражений, используемых в листах Google, см. Спецификацию re2

KyleMit
источник
Насколько я понимаю, вопрос касается документов, а не листов.
törzsmókus