Comment utiliser le texte de la capture de groupes dans Google Docs regex replace?

12

J'essaie de faire correspondre certains textes, puis de les remplacer par le texte plus quelques caractères supplémentaires. Exemple de texte minimal:

#10 Oranges. These are citrus fruits

Sortie désirée:

#10 Oranges. These are citrus fruits

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

Remplacer par: $1\n

(J'ai Match using regular expressionsvérifié)

La regex correspond avec succès #10 Oranges.. Cependant, la référence arrière numérotée ne remplace pas le texte par le groupe de capture, mais entre juste littéralement (la sortie littérale est $1\n). J'ai également essayé d'utiliser une barre oblique inverse pour la référence numérique numérotée \1et le résultat est le même.

Y a-t-il quelque chose qui me manque? Comment réinsérer le texte correspondant dans Google Documents à l'aide d'expressions régulières?

Utilisateur
la source
2
Les documents indiquent désormais explicitement: Note: Capture groups only work with Google Sheets.Voir support.google.com/docs/answer/62754#regular_expressions
Utilisateur

Réponses:

4

Réponse courte

Au lieu d'utiliser la fonction intégrée de recherche et de remplacement, utilisez Google Apps Script ou un module complémentaire.

Explication

Sur la fonctionnalité Rechercher et remplacer de Google Documents, la partie Remplacer ne fonctionne pas avec les expressions régulières et elle ne fonctionne pas non plus avec la replaceText()méthode du service Documents dans le script Google Apps. Heureusement, la méthode de remplacement JavaScript fonctionne.

Pour découvrir les bases de la création d'un script simple, voir https://developers.google.com/apps-script/overview

Code

Ce code est une adaptation de celui inclus dans la référence

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

Références

Rubén
la source
3
J'envisagerai d'examiner cela, mais le fait que remplacer ne fonctionne pas avec regex est-il un bogue? Selon cette documentation, il semble que cela devrait fonctionner: support.google.com/docs/answer/62754#regular_expressions (voir la section Replace with regular expressions)
Utilisateur
2

Petit hacky, mais il ne nécessite pas de script supplémentaire et couvrira probablement 99% de vos cas d'utilisation. Vous pouvez toujours utiliser des groupes de capture avec RegexReplaceet référence dans le texte de remplacement par $1ou $2. Il suffit de diviser votre expression régulière en deux groupes de capture et de concaténer avec un caractère aléatoire (rarement utilisé) comme ~. Ensuite, vous pouvez prendre la valeur retournée entière de cela et remplacer ~par une nouvelle ligne:

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

capture d'écran

Pour plus d'informations sur la syntaxe d'expression régulière utilisée dans les feuilles de Google, voir la spécification re2

KyleMit
la source
la question concerne Docs, pas Sheets, si je comprends bien.
törzsmókus