2016-08-30 25 views
1

Ich brauche den Namen einer KlasseRegex Suche der Name

Class AAA.GitHub Extends %RegisteredObject 
{ 
// some code 

Der Teil I ist AAA.GitHub finden wollen zu bekommen. Es ist sehr leicht zu finden: \bClass\b\s*(\w*(\.\w*)*)
Aber manchmal Leute setzen Kommentare auf der Klassendefinition wie diese

/// some comments 
/* some more 
    Some more text 
and more 
*/ 
Class AAA.GitHub Extends %RegisteredObject 
{ 
// some code 

Das Problem ist, dass diese Kommentare die Wortklasse enthalten. Wie kann ich das umgehen?

+0

Was ist die Umgebung? Probieren Sie '^ Klasse \ b \ s * (\ w * (\. \ W *) *)' –

+0

Es ist Cache-Objekt-Skript, aber reguläre Ausdrücke funktionieren genauso wie überall =) –

+1

* reguläre Ausdrücke funktionieren genauso wie überall * ist eine falsche Aussage, sie arbeiten unterschiedlich über Sprachen/Aromen. –

Antwort

1

Um zu vermeiden, Class innerhalb einzeilige Kommentare übereinstimmt, Sie ^ Beginn Linie Anker verwenden:

(?m)^Class\b\s*(\w*(\.\w*)*) 

Die (?m) bezeichnet ein MULTILINE option die ^ zwingt den Anfang der Zeile zu entsprechen.

Das Muster könnte auch als (?m)^Class\s+(\w[\w.]*) geschrieben werden, glaube ich.

Um zu vermeiden, das Wort innerhalb beide mehrzeilige und einzeilige Kommentare übereinstimmt, die mehrzeilige Kommentare entsprechen, aber sie nicht erfassen:

(?m)/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|^Class\s+(\w[\w.]*) 

Oder, falls die mehrzeilige Kommentare erscheinen immer am Anfang einer Linie,

(?m)^\s*(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/|Class\s+(\w[\w.]*)) 

Ihr Wert wird in der Gruppe befinden 1. regex demo See.

+0

was ist mit der zweiten Art von Kommentaren/* * /? Diese Regex deckt das nicht ab. –

+0

Oh danke, der zweite funktioniert super! –

+0

Beachten Sie, dass im Fall, dass der mehrzeilige Kommentar Teil eines Zeichenfolgenliterals ist, möglicherweise falsche positive Ergebnisse angezeigt werden. Aus diesem Grund habe ich das dritte Muster hinzugefügt, das nur mehrzeilige Kommentare berücksichtigt, die an den Startpositionen der Linie erscheinen, die für eine Regex sicher sind. –