PowerQuery / Expressions régulières

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

  • GetRegExpMatches.xlsx
    20.2 KB · Affichages: 4

Discussions similaires

Statistiques des forums

Discussions
312 082
Messages
2 085 170
Membres
102 804
dernier inscrit
edaguo