2 Stimmen

Was bewirkt dieser reguläre Ausdruck?

Ich bin gerade dabei, ein Programm von Perl nach Java zu konvertieren. Dabei bin ich auf die Zeile

my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);

Ich bin nicht sehr gut mit regulären Ausdrücken, aber von dem, was ich sagen kann, ist dies etwas in der Zeichenfolge $info{$host} mit dem regulären Ausdruck ^ \s *(([^)]+)) \s *$ und die Zuordnung der Übereinstimmung zu $title.

Mein Problem ist, dass ich keine Ahnung habe, was der reguläre Ausdruck tut und worauf er passt. Für jede Hilfe wäre ich dankbar.

感謝

4voto

Konrad Rudolph Punkte 503837

Der reguläre Ausdruck passt auf eine Zeichenkette, die genau ein Paar passender Klammern enthält (eigentlich eine öffnende und eine passende schließende Klammer, aber innerhalb der Klammer können beliebig viele weitere öffnende Klammern vorkommen).

Die Zeichenkette darf mit Leerzeichen beginnen und enden, aber keine anderen Zeichen enthalten. Innerhalb der Paranthesen dürfen jedoch beliebige Zeichen vorkommen (mindestens eines).

Die folgenden Zeichenfolgen sollten damit übereinstimmen:

 (abc)
 (()
   (ab)

Übrigens können Sie den regulären Ausdruck auch einfach so in Java verwenden (nach dem Escapen der Backslashes), indem Sie die Pattern Klasse.

4voto

Es passt zu einer Reihe von führenden Leerzeichen, gefolgt von einem linken Paren, gefolgt von einem Text, der kein rechtes Paren enthält, gefolgt von einem rechten Paren, gefolgt von weiteren Leerzeichen.

Spielt:

      (some stuff)  

Scheitert:

 (some stuff

     some stuff)

   (some stuff)  asadsad

1voto

James Anderson Punkte 26827

Ok, Schritt für Schritt

/ - die Regex zitieren

^ - der Anfang der Zeichenkette

\s * - null oder mehr beliebige raumähnliche Zeichen

( - ein tatsächliches ( Zeichen

( - eine Erfassungsgruppe beginnen

[^)]+ eines der Zeichen ^ oder ), wobei das + für mindestens ein

) - Beenden Sie die Erfassungsgruppe

) und tatsächliches ) Zeichen

\s * null oder mehr leerzeichenähnliche Zeichen

$ - das Ende der Zeichenkette

/ - schließt das Regex-Zeichen

Soweit ich das beurteilen kann, suchen wir also nach Zeichenfolgen wie " (^)" oder "())". Ich glaube, ich übersehe hier etwas.

0voto

Sinan Ünür Punkte 114993
my ($title) = ($info{$host} =~ /^\s*\(([^\)]+)\)\s*$/);

Erstens, m// im Listenkontext gibt die erfassten Treffer zurück. my ($title) setzt die rechte Seite in einen Listenkontext. Zweitens, $info{$host} wird mit dem folgenden Muster abgeglichen:

/^ \s* \( ( [^\)]+) \) \s* $/x

Ja, verwendet die x Flagge, damit ich einige Leerzeichen einfügen kann. ^\s* überspringt alle führenden Leerzeichen. Dann haben wir eine escapte Paranthese (deshalb wird keine Capture-Gruppe erstellt. Dann haben wir eine Capture-Gruppe, die [^\)] . Diese Zeichenklasse kann besser geschrieben werden als [^)] weil die rechte Klammer in einer Zeichenklasse nichts Besonderes ist und bedeutet alles außer einer linken Klammer .

Wenn auf die öffnende Klammer ein oder mehrere andere Zeichen als eine schließende Klammer folgen, gefolgt von einer schließenden Klammer, die optional auf beiden Seiten von Leerzeichen umgeben ist, wird diese Zeichenfolge erfasst und in die $x .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X