2
votes

RegEx qui ne changerait que les déclarations de fonction de niveau supérieur

J'ai des fichiers Javascript contenant des fonctions de la forme:

private xyz(a,b,c,...){
....
}

Je souhaite les changer en la forme suivante pour des raisons de migration Typescript:

function xyz(a,b,c,...){
....
}


1 commentaires

Je suppose que vous avez lu stackoverflow.com/questions/133601/... déjà ... sinon - bon point de départ ... Probablement stackoverflow.com/questions/19596502/regex-nested-parenthese‌ s peut même être utilisé comme doublon.


3 Réponses :


-2
votes

Cela fonctionnerait pour vous

 var src = @"function xyz(a,b,c,...){
   function abc(){
   }
 }";  
 var pattern = @"\s*function\s*(?=\w+\(\w+|,\)\s*\{.+?})";

var result = Regex.Replace(src, pattern, "private ", RegexOptions.Multiline);
result.Dump();

Vérifiez Ceci

PS: vous devez activer l'option MultiLine


7 commentaires

Je l'ai essayé avec regexstorm.net/tester et il n'a pas pu trouver de correspondance.


Vérifiez à nouveau ma réponse s'il vous plaît


Cela traite-t-il des fonctions imbriquées comme OP fait allusion?


Je n'ai pas vu ça, mais maintenant c'est le cas. Pouvez-vous le vérifier à nouveau?


Je ne comprends tout simplement pas. le script fonctionne parfaitement bien. pourquoi ai-je obtenu un vote négatif?


Je ne suis PAS l'un des downvoters mais voici un exemple d'entrée qui ne fonctionne pas: function svdsv () {var gsrsgrsgss = this.vdvsdv ("sgrgsgrs-sgrsgr"); this.ssgrgsrsgs (); this.sgrsgrgsrgs (); var srgrsgrsg = {srgrsg: srgrsg}; sgrsg.sgrgs (ceci, sgrsg.srgrgs + "gr / rs / sr / sr", srg, sgr, srg); }


@JohnL. - c'est trop :) il suffit d'avoir entre guillemets bouclés la fonction externe function external (a) {var x = "}"; function inner (b) {...}} vérifier ceci ). L'analyse de constructions imbriquées avec des expressions régulières est difficile même lorsque vous utilisez des expressions régulières étendues (comme vous ne pouvez pas le faire avec les expressions régulières classiques de l'informatique)



-1
votes

Cela peut être aussi simple que de faire correspondre:

/^\tfunction/gm    or    /^    function/gm

À condition que vos fonctions de niveau supérieur n'aient pas d'indentation ( démo ). Ou s'ils sont indentés, disons, une tabulation ou 4 espaces que vous pouvez utiliser:

/^function/gm

Ceci utilise l'ancre de début de ligne ( ^ ) .


3 commentaires

Je ne vous ai pas contre-voté, mais certaines personnes voteront contre les réponses aux mauvaises questions qui sont soit des doublons, soit aucun effort n'est montré.


@Wai Je suis sûr que ce n'est pas le cas, car la question elle-même n'a pas de votes négatifs.


pas sûr alors. Cela ne peut pas être un vote tactique, car la seule réponse sans votes négatifs est celle d'un utilisateur qui ne peut actuellement pas voter du tout.



0
votes

Match: function (. + {. * (. * {(? 2)}. *) *. *?}) par le paramètre multiligne sur

Puis remplacer par: private \ 1

Ce RegEx correspond entièrement à la fonction, y compris toutes les fonctions imbriquées / instructions if, etc., vous ne pouvez donc remplacer que la plus externe.

Explication

function                Matches function keyword
         (              Starts capture group
          .+            Matches function name and parameters
            {           Opens function
             .*         Matches any code in function
               (        Starts new capture group (2) for catching internal curly braces
                .*      Matches any code in function
                  {     Matches opening curly brace
                   (?2) Matches capture group (2), to match any code and curly braces inside
                  }     Matches closing curly brace
                .*      Matches any code
              )*        Closes capture group (2) and allows it to be repeated
           .*?          Matches any code, until next curly brace
          }             Matches closing curly brace
         )              Closes capture group

Notez que la récursivité ( (? 2) ) n'est pas prise en charge dans .net par défaut, vous devrez donc utiliser un autre RegEx -Moteur pour C #, tel que PCRE pour .Net .

Si vous ne voulez pas utiliser un autre moteur, vous pouvez remplacer le (? 2) par (. * {(? 2)}. *) * récursivement aussi profond que que vous voulez, comme pour faire correspondre les boucles if imbriquées etc., et enfin remplacer le (? 2) par . * . Le résultat devrait ressembler à ceci: fonction (. + {. * (. * {(. * {(. * {(. * {(. * {(. * {(. *)}. *) *}. *) *}. *) *}. *) *}. *) *}. *) *. *?})


4 commentaires

Pourriez-vous s'il vous plaît fournir l'expression que je peux essayer sur regexstorm.net/tester ?


Je suis sûr qu'il vous manque les deux types de chaînes qui peuvent être utilisées dans le code TypeScript / JavaScript - '}' et "}" dans votre expression régulière similaire à l'autre answer stackoverflow.com/a/54857054/477420 ... Aussi celui-ci a une chance de construire un analyseur complet :)


J'ai essayé la fonction (. + {. * (. * {(. * {(. * {(. * {(. * {(. * {(. *)}. *) *}. *) *}. * ) *}. *) *}. *) *} ‌. *) *. *}) Mais il prend aussi les fonctions suivantes, jusqu'au dernier caractère "}" qu'il voit.


Je n'ai pas pensé à ça. Essayez ceci: function (. + {. * (. * {(. * {(. * {(. * {(. * {(. * {(. *)}. *) *}. *) *}. *) *}. *) *}. *) *} ‌. *) *. *?})