Como usar o texto de capturar grupos no regex do Google Docs substituir?

11

Estou tentando corresponder a determinado texto e substituí-lo pelo texto, além de alguns caracteres extras. Texto de exemplo mínimo:

#10 Oranges. These are citrus fruits

Saída desejada:

#10 Oranges. These are citrus fruits

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

Substituir com: $1\n

(Eu Match using regular expressionsverifiquei)

A regex corresponde com êxito #10 Oranges.. No entanto, a referência retroativa numerada não substitui o texto pelo grupo de captura, mas entra literalmente (a saída literal é $1\n). Também tentei usar uma barra invertida para a referência retroativa numerada \1e o resultado é o mesmo.

Tem algo que estou perdendo? Como reinserir o texto correspondente no google docs usando expressões regulares?

Do utilizador
fonte
2
Os documentos agora declaram explicitamente: Note: Capture groups only work with Google Sheets.consulte support.google.com/docs/answer/62754#regular_expressions
usuário

Respostas:

3

Resposta curta

Em vez de usar a função interna de localizar e substituir, use o Script do Google Apps ou um complemento.

Explicação

No recurso Localizar e substituir do Google Documents, a peça Substituir não funciona com expressões regulares e também com o método replaceText () do Serviço de documentos no Script do Google Apps. Felizmente, o método de substituição do JavaScript funciona.

Para aprender o básico para criar um script simples, consulte https://developers.google.com/apps-script/overview

Código

Este código é uma adaptação do código incluído na referência

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') );
  }
}

Referências

Rubén
fonte
3
Vou considerar investigar isso, mas o fato de substituir não funcionar com regex é um bug? De acordo com esta documentação, parece que deve funcionar: support.google.com/docs/answer/62754#regular_expressions (consulte a seção Replace with regular expressions)
Usuário
2

Pouco hacky, mas não requer um extra extra de script e provavelmente cobrirá 99% dos seus casos de uso. Você ainda pode usar grupos de captura com RegexReplacee referência no texto de substituição por $1ou $2. Apenas divida seu regex em dois grupos de captura e concatene com um caractere aleatório (raramente usado) como ~. Em seguida, você pode pegar todo o valor retornado e substituí-lo ~por uma nova linha:

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

captura de tela

Para obter mais informações sobre a sintaxe regex usada nas folhas do Google, consulte a especificação re2.

KyleMit
fonte
a pergunta é sobre o Google Docs, não o Planilhas, pelo que entendi.
törzsmókus