Regulärer Ausdruck zum Abrufen der Parameterliste aus der Funktionsdefinition [duplizieren]

7

Ich arbeite gerade an einem Projekt in Javascript (node.js), das versucht, ein Array von Parametern Namen (keine Werte, ich brauche keine Argumente) von einer Funktion zu bekommen. Ich verwende derzeit Function.toString (), um die Funktionszeichenfolge abzurufen, und führe dann eine Regex dagegen aus, um meine Parameterliste zu erhalten.

Nehmen wir das folgende EINFACHE Beispiel:

%Vor%

Ich führe meine Regex dagegen und mache dann eine String-Magie (Split, etc). Ich würde ein Array wie folgt erwarten:

%Vor%

Ich habe etwas, das funktioniert, aber ich habe das Gefühl, dass es wahrscheinlich nicht die beste Lösung ist, wenn man einige der funkigen Zeichen verwendet, die man für Variablennamen verwenden kann und mit denen man Funktionen auf mehreren Zeilen definieren kann.

Hier ist, was ich derzeit habe:

%Vor%

Das gibt mir mein "Match" in Gruppe 1 und dann meine Param-Liste ohne Parens in Gruppe 2, was cool ist. Ist das wirklich die beste Art zu tun, was ich will? Gibt es einen besseren regulären Ausdruck, den ich dafür verwenden könnte? Ich suche nicht wirklich etwas "Einfacheres", sondern wirklich nur etwas, das alle möglichen Situationen erfassen könnte.

Jede Hilfe wäre willkommen, und vielen Dank im Voraus!

    
Jason L. 19.12.2012, 12:51
quelle

3 Antworten

16

Am einfachsten wäre es, alles im ersten Satz von Parens zu erfassen und dann split(/\s*,\s*/) zu verwenden, um das Array zu erhalten.

ZB:

%Vor% %Vor%

Wie das obige funktioniert:

  1. Wir verwenden /\( *([^)]+?) *\)/ , um die erste öffnende Klammer ( \( , da ( speziell in Regexes ist), gefolgt von einer beliebigen Menge an optionalen Leerzeichen, gefolgt von einer Capture-Gruppe, die alles außer einer schließenden Klammer erfasst (aber nicht gierig), gefolgt von einer beliebigen Menge an optionalen Leerzeichen, gefolgt von dem schließenden ) .

  2. Wenn wir erfolgreich sind, teilen wir uns mit /\s*,\s*/ , was bedeutet, dass wir uns auf Sequenzen aufteilen, die null oder mehr Leerzeichen ( \s* ) gefolgt von einem Komma gefolgt von null oder mehr Leerzeichen (dieses Whitespace-Ding) haben Deshalb sind die Argumente in meiner Beispielfunktion so seltsam).

Wie Sie aus dem Beispiel sehen können, behandelt dies führende Whitespaces (nach dem ( und vor dem ersten Argument), Whitespaces um die Kommas und nachfolgende Whitespaces - einschließlich Zeilenumbrüche. Es tut nicht , Kommentare innerhalb der Argumentliste zu behandeln, was die Sache erheblich komplizierter machen würde.

Randnotiz: Stellen Sie sicher, dass Sie auf Ihren Zielbrowsern testen, Function#toString das Zurückgeben einer Form des Quellcodes ist eine nicht standardmäßige Funktion. Es wird weitgehend unterstützt (in Desktop-Browsern), aber nicht Standard. Beachten Sie, dass einige Browser Kommentare enthalten, andere nicht. Wenn jemand Kommentare in die Funktionsargumente einfügt, könnte das Ihre Analyse der Argumente stören. Sie können den Prototyp-Quellcode für die Erweiterung Function#argumentNames ausprobieren weil sie schon diesen Weg gegangen sind ...

    
T.J. Crowder 19.12.2012, 12:53
quelle
3

Gehen Sie wie folgt vor:

%Vor%

Erinnern Sie sich? nach * tut ein nicht gieriger Fund

    
closure 19.12.2012 13:00
quelle
2

Lassen Sie mich vorschlagen, dass Sie reguläre Ausdrücke verwenden:

  • [Übereinstimmung] /function[^(]*\(([^)]*)\)/ entspricht der Argumentliste
  • [split] /\W+/ (gegen die Ergebnisse der ersten Match-Daten) teilt das Match in die params-Liste
  • auf

Der Code sollte also so aussehen:

%Vor%     
shybovycha 19.12.2012 13:10
quelle

Tags und Links