Come utilizzare il testo da gruppi di acquisizione in regex di Documenti Google sostituire?


12

Sto cercando di abbinare un determinato testo e quindi sostituirlo con il testo più alcuni caratteri extra. Testo di esempio minimo:

#10 Oranges. These are citrus fruits

Uscita desiderata:

#10 Oranges. These are citrus fruits

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

Sostituirlo con: $1\n

(Ho Match using regular expressionscontrollato)

La regex corrisponde correttamente #10 Oranges.. Tuttavia, il backreference numerato non sostituisce il testo con il gruppo di acquisizione ma va semplicemente alla lettera (l'output letterale è $1\n). Ho anche provato a usare una barra rovesciata per il riferimento numerato \1e il risultato è lo stesso.

C'è qualcosa che mi manca? Come reinserire il testo corrispondente nei documenti di Google utilizzando le espressioni regolari?


2
I documenti ora dichiarano esplicitamente: Note: Capture groups only work with Google Sheets.vedi support.google.com/docs/answer/62754#regular_expressions
Utente

Risposte:


4

Risposta breve

Invece di utilizzare la funzione integrata Trova e sostituisci, utilizza Google Apps Script o un componente aggiuntivo.

Spiegazione

Nella funzione Trova e sostituisci di Google Documenti, la parte Sostituisci non funziona con le espressioni regolari e non funziona neanche con il replaceText()metodo del Servizio Documenti nello script di Google Apps, per fortuna il metodo di sostituzione JavaScript funziona.

Per apprendere le basi per creare un semplice script, vedi https://developers.google.com/apps-script/overview

Codice

Questo codice è un adattamento di quello incluso nel riferimento

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

Riferimenti


3
Prenderò in considerazione questo aspetto, ma il fatto che sostituire non funziona con regex è un bug? Secondo questa documentazione, sembra che dovrebbe funzionare: support.google.com/docs/answer/62754#regular_expressions (vedere la sezione Replace with regular expressions)
Utente

2

Un po 'confuso, ma non richiede un'aggiunta aggiuntiva allo script e probabilmente coprirà il 99% dei casi d'uso. È ancora possibile utilizzare gruppi di acquisizione con RegexReplacee riferimento nel testo di sostituzione con $1o $2. Basta dividere la tua regex in due gruppi di cattura e concatenare con un carattere casuale (usato raramente) come ~. Quindi puoi prendere l'intero valore restituito da quello e sostituirlo ~con una nuova riga:

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

immagine dello schermo

Per ulteriori informazioni sulla sintassi regex utilizzata nei fogli di google, consultare le specifiche re2


la domanda riguarda i documenti, non i fogli, per quanto ho capito.
törzsmókus,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.