2009-02-27 7 views
0

einige Probleme Nachdem die regex herauszufinden, dies entsprechen:Regex: Problem zu schaffen Anpassungsmuster

function Array() { [native code] } 

Ich versuche nur den Text übereinstimmen, die auftreten werden, wo „Array“ ist.

+0

ich denke, dass Ihre Frage sehr unklar ist. – Cerebrus

+0

Das ist meine Saite. Der Text, in dem sich "Array" befindet, ändert sich. Also versuche ich das zu erreichen. – Geuis

+0

Sie versuchen also, den Text zwischen "function" und "()" anzupassen? – Goran

Antwort

4

Möchten Sie herausfinden, welcher Typ eine Variable in Javascript ist? Wenn das ist, was wollen, können Sie nur den Konstruktor an den Konstruktor des Objekts vergleichen, die sie erstellt denken:

var array = new Array(); 
if(array.constructor == Array) 
    alert("Is an array"); 
else 
    alert("isn't an array"); 

Das ist nicht wirklich der beste Weg, um die Dinge in Javascript zu gehen. Javascript hat kein Typsystem wie C#, das garantiert, dass eine Variable bestimmte Mitglieder hat, wenn sie von einem bestimmten Konstruktor erstellt wird, weil JavaScript eine ziemlich dynamische Sprache ist und alles, was ein Objekt von seinem Konstruktor erhält, zur Laufzeit überschrieben werden kann.

es ist stattdessen wirklich besser Ente eingeben zu verwenden und Ihre Objekte fragen, was sie tun können, als das, was sie sind: http://en.wikipedia.org/wiki/Duck_typing

if(typeof(array.push) != "undefined") 
{ 
    // do something with length 
    alert("can push items onto variable"); 
} 
+0

Dies half mir tatsächlich, das Problem zu lösen, das ich versuchte. Danke, dass Sie mir durchgelesen haben, was ich von meiner Absicht erwartet hatte. – Geuis

+0

+1 für psychische Debugging-Fähigkeiten. :-) – Tomalak

3

In Perl, dann würden Sie verwenden:

m/^\s*function\s+(\w+)\s*\(/; 

Die Variable '$1' würde erfassen den Funktionsnamen.

Wenn das Schlüsselwort function nicht am Anfang der Zeile steht, dann müssen Sie (etwas) härter arbeiten.

[Edit:. Zwei '\s*' Sequenzen hinzugefügt]


Frage, ob das funktioniert ... hier ist mein Testfall:

Testskript:

while (<>) 
{ 
    print "$1\n" if (m/^\s*function\s+(\w+)\s*\(/); 
} 

-Test Eingangsleitungen (ja, absichtlich falsch ausgerichtet):

function Array() { ... } 
function Array2 () { ... } 
func Array(22) { ... } 

Testausgang:

Array 
Array2 

Getestet mit Perl 5.10.0 auf Solaris 10 (SPARC): Ich glaube nicht, die Plattform oder Version ist ein wichtiger Faktor - ich würde erwarten, dass es das gleiche arbeiten irgendeine plausible Version von Perl.

+0

Ist es so schwer ein \ s * am Anfang hinzuzufügen? Und vielleicht ist es keine schlechte Idee (obwohl ich JavaScript nicht kann), ein \ s * zwischen dem (\ w +) und dem \ (? –

+0

@Chris: +1. Ich öffnete das Kommentarfeld, um das gleiche zu empfehlen ... – Swanand

+0

Da jeder schon pingelig ist;) Warum die^und die * s überhaupt einbeziehen? Es gibt keine Notwendigkeit für diese Einschränkung, eine einfache \ bFunktion, um eine Wortgrenze anzuzeigen, sollte es tun. Das \ s * am Ende ist auch überflüssig, wieso kümmert sich überhaupt was nach dem Spiel? – Tomalak

0

So später, ich habe dies die fast funktioniert bekommen:

[function\s]((\S+)+)(?=\(\)) 

aber sie paßt immer noch den Raum vor dem Array

+0

Entfernen Sie die '[', ']'. – Gumbo