PowerQuery / Expressions régulières

  • Initiateur de la discussion Initiateur de la discussion mromain
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

mromain

XLDnaute Barbatruc
Bonjour à tous,

Même si Power Query ne supporte pas nativement les expressions régulières, il est possible de les utiliser avec la fonction Web.Page (https://docs.microsoft.com/en-us/powerquery-m/web-page) qui permet d’exécuter du JavaScript - qui lui peut exécuter des expressions régulières.

Des exemples des fonction test, match et replace sont disponibles ici : https://stackoverflow.com/questions/57547297/regexp-in-power-query-using-javascript.

L’inconvénient de la fonction match est qu’elle ne retourne que la première occurrence trouvée.
La fonction GetRegExpMatches ci-dessous permet, elle, de récupérer toutes les occurrences trouvées :
Code:
(text as text, pattern as text) as table =>
    let
        scriptJS = "var input = '" & Text.Replace(Text.Replace(text, "'", "\'"), "#(lf)", "\n") & "';
                    var regExp = " & pattern & ";
                    var match;
                    var match;
                    var matchesInfos = [];
                    var result;
                    var nbSubMatches=0;
                    while (match = regExp.exec(input)){
                      var matchInfos = [];
                      if (match.length-1 > nbSubMatches){
                        nbSubMatches = match.length-1;
                      }
                      matchInfos.push(match.index.toString());
                      for (var i = 0; i < match.length; i++){
                        matchInfos.push('""' + match[i].toString().replace(/""/g, '""""') + '""');
                      }
                      matchesInfos.push('{' + matchInfos.join(', ') + '}');
                    }
                    result = '#table(type table [Position=number, Match=text'
                    for (var i = 1; i <= nbSubMatches; i++){
                      result += (', Group' + i.toString() + '=text'); 
                    }
                    result += '], {' + matchesInfos.join(', ') + '})';
                    document.write(result)",
        webPage = Web.Page("<script>" & scriptJS & "</script>"),
        resultJS = webPage{0}[Data]{0}[Children]{1}[Children]{0}[Text],
        toTable = Expression.Evaluate(resultJS)
    in
        totable

Les valeurs trouvées sont renvoyées dans une table avec les colonnes suivantes :
  • Position qui contient la position de départ (dans le texte recherché) de l’occurrence trouvée
  • Match qui contient le texte de l’occurrence trouvée
  • Des colonnes GroupX si l’expression régulière contient des groupes.

Le format du pattern à définir est celui du JavaScript (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions).

N’étant ni un expert des expressions régulières, ni de JavaScript (c’est ici mon premier essai), je ne peux pas garantir que la fonction est parfaite. C’est juste un essai pour le fun.

Le fichier joint contient cette fonction accompagnée de 4 exemples.

A+
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour