Groups keyboard shortcuts have been updated
Dismiss
See shortcuts

extract by using REGEX function and match method

57 views
Skip to first unread message

Le pirate noir

unread,
Oct 7, 2024, 2:57:02 PM10/7/24
to Google Apps Script Community
Hi all,

I'am trying to extract datas from a text by using REEGEX function

I have this text 

Title ABC
17:59:58 D 2019/11/08
Phone 487-584 - 5486
Pin 87945
Date
2020-12-04
Pin # other text  453-34
Sub-total 
45
Due Date April 5, 2024
Total 50 



1 - First i would like to extract only the whole first line before break line which is : Title ABC
when i try this :  textContent.match(/([^\s]+)/i), it retuns only : Title

2 - How to extract the sequence of numbers (there can be - also in the sequence) after detecting the keyword : *Pin* Note that pin could be writting also in capital letters or lower case and  there can be some more texts after detecting that keyword . So the results should be [87945, 453-34]

3 - Being  able to extract all the dates in the text no matter the format. The date can be after a break line or after a space. In this case, the results would be [2019/11/08, 2020-12-04,April 5, 2024]

4 - Extract number after the exact keyword Total. Total can be written in capital letters too. In this case the result would be : 50 and not 45.

Thanks for your help

Fabrice Faucheux

unread,
Oct 12, 2024, 3:18:40 AM10/12/24
to Google Apps Script Community
Salut Pirate !

Pour répondre à ta demande d’extraction de données à partir d’un texte en utilisant des expressions régulières (Regex), voici des solutions pour chaque point que tu as mentionné :


1 - Extraire la première ligne entière avant le saut de ligne

Pour extraire la première ligne complète, tu dois rechercher tout ce qui précède un saut de ligne. L’expression régulière suivante permet de capturer la ligne complète :

var firstLine = textContent.match(/^[^\n\r]+/);

Explication : ^[^\n\r]+ capture tous les caractères au début du texte jusqu’à rencontrer un saut de ligne. Cette expression fonctionne même s’il y a des espaces dans la première ligne.


2 - Extraire les séquences de nombres après le mot clé “Pin” (insensible à la casse)


Pour capturer les séquences de chiffres après le mot-clé “Pin” (en majuscule, minuscule ou mélangé), voici l’expression :

var pinNumbers = textContent.match(/pin\s*#?\s*([0-9-]+)/gi);

Explication :

• pin capture “Pin” sans se soucier des majuscules ou minuscules (i pour insensible à la casse).

• \s* gère les espaces potentiels après “Pin”.

• #? capture éventuellement un “#” après “Pin”.

• ([0-9-]+) capture une séquence de chiffres ou de tirets (comme 87945 ou 453-34).

Tu obtiendras un tableau avec les différentes occurrences de “Pin” suivies de leur séquence numérique.


3 - Extraire toutes les dates

Pour extraire toutes les dates, quel que soit leur format (YYYY/MM/DD, YYYY-MM-DD, mois jour, année), voici une expression qui couvre plusieurs formats courants de dates :

var dates = textContent.match(/(\d{4}[\/-]\d{2}[\/-]\d{2})|([A-Za-z]+ \d{1,2}, \d{4})/g);

Explication :

• \d{4}[\/-]\d{2}[\/-]\d{2} capture les dates au format YYYY/MM/DD ou YYYY-MM-DD.

• [A-Za-z]+ \d{1,2}, \d{4} capture les dates au format Mois Jour, Année comme “April 5, 2024”.

Cette expression retournera un tableau avec toutes les dates.


4 - Extraire le montant après le mot clé “Total”

Pour extraire le nombre après le mot-clé “Total” (indifférent à la casse), voici l’expression à utiliser :

var total = textContent.match(/total\s+(\d+)/i);

Explication :

• total\s+ capture le mot “Total” suivi d’un ou plusieurs espaces.

• (\d+) capture la séquence de chiffres qui suit immédiatement.

• i permet de rendre la recherche insensible à la casse (Total, TOTAL, total…).


Cette expression renverra la valeur correspondant à 50 et non 45, car elle recherche le mot “Total” exact avant d’extraire le nombre.

En combinant ces expressions régulières dans ton script, tu pourras extraire les données demandées de manière fiable. Voici un exemple d’implémentation complète :


function extractData(textContent) {

  // 1. Extraire la première ligne avant le saut de ligne

  var firstLine = textContent.match(/^[^\n\r]+/);  

  // 2. Extraire les séquences de chiffres après"Pin"

  var pinNumbers = textContent.match(/pin\s*#?\s*([0-9-]+)/gi);

  // 3. Extraire toutes les dates

  var dates = textContent.match(/(\d{4}[\/-]\d{2}[\/-]\d{2})|([A-Za-z]+ \d{1,2}, \d{4})/g);

  // 4. Extraire le montant après "Total"

  var total = textContent.match(/total\s+(\d+)/i);

  // Afficher les résultats dans la console

  Logger.log('First Line: ' + firstLine);

  Logger.log('Pin Numbers: ' + pinNumbers);

  Logger.log('Dates: ' + dates);

  Logger.log('Total: ' + (total ? total[1] : 'No total found'));

}

Cela te permet de gérer les différentes extractions de manière efficace.

Fabrice
https://atelier-informatique.com/blog/

Stéphane Ray Noel

unread,
Oct 13, 2024, 9:27:42 AM10/13/24
to google-apps-sc...@googlegroups.com
Salut Fabrice !

Tes explications sont très claires, je te remercie énormément.

Je suis allé sur https://regex101.com/ pour tester les expressions 

1-       /pin\s*#?\s*([0-9-]+)/gi 

j'obtiens juste le résultat : 87945 et pas le 453-34. C'est sans doute à cause du string  other text : Pin # other text  453-34. Comment pourrait-on faire en sorte que l'expression tienne compte de ce résultat également ? Comme je l'avais mentionné au départ,  après détection du mot pin, on peut retrouver ou non du texte entre le mot clé et la séquence de chiffres qui peut avoir également un tiret.

2 -      /total\s+(\d+)/i
Cette expression me renvoie la valeur 45 et non 50 comme je le souhaitais. Je ne sais pas si c'est possible mais il ne faudrait pas que l'expression trouve le mot clé total si j'ai par exemple des nombres qui viennent après le mot sous-total.

Sinon pour le reste, tout fonctionne à merveille.Encore une fois, merci pour ton aide.


"Ce message et toutes les pièces jointes (ci-après le "message") sont établis à l'intention exclusive de ses destinataires et sont confidentiels. Si vous recevez ce message par erreur, merci de le détruire et d'en avertir immédiatement l’expéditeur. Toute utilisation de ce message non conforme à sa destination, toute diffusion 
ou toute publication, totale ou partielle, est interdite, sauf autorisation expresse. L'internet ne permettant pas d'assurer l'intégrité de ce message, nous déclinons toute responsabilité au titre de ce message, dans l’hypothèse où il aurait été modifié."

--
You received this message because you are subscribed to a topic in the Google Groups "Google Apps Script Community" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/google-apps-script-community/WqK788Iqino/unsubscribe.
To unsubscribe from this group and all its topics, send an email to google-apps-script-c...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/google-apps-script-community/2964deb8-9a16-4ccf-8123-b97a53ee0a1cn%40googlegroups.com.
Message has been deleted
Message has been deleted
Message has been deleted
Message has been deleted

Fabrice Faucheux

unread,
Oct 13, 2024, 11:31:45 AM10/13/24
to Google Apps Script Community

Salut Stéphane !

Merci pour ton retour ! Je vois les deux petits ajustements à faire pour répondre à tes besoins.

1. Pin avec texte intermédiaire :

Si après le mot-clé “Pin”, il peut y avoir du texte avant la séquence de chiffres (par exemple, “Pin # other text 453-34”), on peut utiliser une expression régulière qui autorise la présence d’autres mots après “Pin” avant d’atteindre les chiffres. Voici comment ajuster l’expression :

var pinNumbers = textContent.match(/pin\s*#?.*?([0-9-]+)/gi);

Explication :

• .*? : Capture tous les caractères entre “Pin” et la séquence de chiffres, de manière non-gourmande (c’est-à-dire qu’il s’arrêtera dès qu’il trouvera des chiffres).

• ([0-9-]+) : Capture les chiffres avec ou sans tirets.

Cela te permettra de récupérer toutes les séquences de chiffres même s’il y a du texte intermédiaire.

2. Total sans Sous-total :

Pour éviter de capturer le montant après “Sous-total”, on peut spécifier que le mot “Total” ne doit pas être précédé de “Sous-” dans la même ligne. Voici comment modifier l’expression :

var total = textContent.match(/(?<!sous-)\btotal\s+(\d+)/i);

Explication :

• (?<!sous-) : Assure que “Total” n’est pas précédé de “Sous-” sur la même ligne.

• \b : Assure qu’on recherche le mot entier “Total” et pas une sous-chaîne d’un autre mot.

Avec cette nouvelle expression, tu devrais maintenant obtenir “50” et non “45”.

Voici la version complète avec ces ajustements :

function extractData(textContent) {

  // 1. Extraire la première ligne avant le saut de ligne

  var firstLine = textContent.match(/^[^\n\r]+/);  

  // 2. Extraire les séquences de chiffres après "Pin" même avec du texte intermédiaire

  var pinNumbers = textContent.match(/pin\s*#?.*?([0-9-]+)/gi);

  // 3. Extraire toutes les dates

  var dates = textContent.match(/(\d{4}[\/-]\d{2}[\/-]\d{2})|([A-Za-z]+ \d{1,2}, \d{4})/g);

  // 4. Extraire le montant après "Total" sans prendre le sous-total

  var total = textContent.match(/(?<!sous-)\btotal\s+(\d+)/i);

  // Afficher les résultats dans la console

  Logger.log('First Line: ' + firstLine);

  Logger.log('Pin Numbers: ' + pinNumbers);

  Logger.log('Dates: ' + dates);

  Logger.log('Total: ' + (total ? total[1] : 'No total found'));

}

Teste ces modifications et dis-moi si cela répond bien à tes attentes ! 😊

Fabrice



Fabrice Faucheux

unread,
Oct 14, 2024, 6:57:36 AM10/14/24
to Google Apps Script Community

Salut Stéphane !

Merci pour ton retour ! Je vois les deux petits ajustements à faire pour répondre à tes besoins.

1. Pin avec texte intermédiaire :

Si après le mot-clé “Pin”, il peut y avoir du texte avant la séquence de chiffres (par exemple, “Pin # other text 453-34”), on peut utiliser une expression régulière qui autorise la présence d’autres mots après “Pin” avant d’atteindre les chiffres. Voici comment ajuster l’expression :

var pinNumbers = textContent.match(/pin\s*#?.*?([0-9-]+)/gi);


Explication :

• .*? : Capture tous les caractères entre “Pin” et la séquence de chiffres, de manière non-gourmande (c’est-à-dire qu’il s’arrêtera dès qu’il trouvera des chiffres).

• ([0-9-]+) : Capture les chiffres avec ou sans tirets.

Cela te permettra de récupérer toutes les séquences de chiffres même s’il y a du texte intermédiaire.

2. Total sans Sous-total :

Pour éviter de capturer le montant après “Sous-total”, on peut spécifier que le mot “Total” ne doit pas être précédé de “Sous-” dans la même ligne. Voici comment modifier l’expression :

var total = textContent.match(/(?<!sous-)\btotal\s+(\d+)/i);

Explication :

• (?<!sous-) : Assure que “Total” n’est pas précédé de “Sous-” sur la même ligne.

• \b : Assure qu’on recherche le mot entier “Total” et pas une sous-chaîne d’un autre mot.

Avec cette nouvelle expression, tu devrais maintenant obtenir “50” et non “45”.


Voici la version complète avec ces ajustements :

function extractData(textContent) {

  // 1. Extraire la première ligne avant le saut de ligne

  var firstLine = textContent.match(/^[^\n\r]+/);  

  // 2. Extraire les séquences de chiffres après "Pin" même avec du texte intermédiaire

  var pinNumbers = textContent.match(/pin\s*#?.*?([0-9-]+)/gi);

  // 3. Extraire toutes les dates

  var dates = textContent.match(/(\d{4}[\/-]\d{2}[\/-]\d{2})|([A-Za-z]+ \d{1,2}, \d{4})/g);

  // 4. Extraire le montant après "Total" sans prendre le sous-total

  var total = textContent.match(/(?<!sous-)\btotal\s+(\d+)/i);


  // Afficher les résultats dans la console

  Logger.log('First Line: ' + firstLine);

  Logger.log('Pin Numbers: ' + pinNumbers);

  Logger.log('Dates: ' + dates);

  Logger.log('Total: ' + (total ? total[1] : 'No total found'));

}

Teste ces modifications et dis-moi si cela répond bien à tes attentes ! 😊

Fabrice
https://atelier-informatique.com/blog/

Stéphane Ray Noel

unread,
Oct 15, 2024, 9:21:23 PM10/15/24
to google-apps-sc...@googlegroups.com
Tout est parfait. Merci Fabrice :)

Reply all
Reply to author
Forward
0 new messages