2012-10-03 23 views
6

Ich habe begonnen, die .match(Regex) Methode in meinem Java-Programm zu verwenden, aber für den Moment verwende ich nur eine Zeichenfolge (String regexString = new String("[^a-zA-Z0-9][^a-zA-Z0-9]*"); das ist, was ich bisher als Beispiel habe). Ich weiß aber, ich kann eine tatsächliche Regex (Regex pattern = new Regex() & the Pattern class dann kompilieren Sie es (?) Einige wie).Regex mit einer Zeichenfolge oder nicht mit einer Zeichenfolge regex?

Gibt es einen Vorteil, Regex als eine Klasse und nicht nur eine Zeichenfolge in Java zu verwenden? Ich bin ziemlich daran gewöhnt, Skripte zu bashlen, und Regexes sind nur "Strings" im weitesten Sinn, und es gibt keine Fähigkeit/Notwendigkeit für eine separate Klasse, also kämpfe ich darum, wo es einen gibt.

+2

Schreiben Sie niemals 'new String (" ... ");'. Verwenden Sie stattdessen '" ... "' stattdessen: 'String regexString =". * ";'. Es ist unnötig und ineffizient, explizit ein neues "String" -Objekt zu erstellen. – Jesper

+0

Wird ein Objekt nicht erstellt, wenn ich das trotzdem mache? Was passiert, wenn ich mehrere separate Strings habe? – Pureferret

+3

Ja, wenn Sie nur ein Literal verwenden, zum Beispiel '". * "', Wird ein 'String' Objekt erzeugt. Wenn Sie aber 'new String (". * ")' Machen, wird ein zweites 'String'-Objekt erzeugt, das den Inhalt der Literal-Zeichenfolge kopiert, was unnötig ist. Zeichenfolgen sind in Java unveränderlich. Java verfügt über einen String-Pooling-Mechanismus. Wenn Sie also dasselbe String-Literal mehrmals verwenden, gibt es nur ein "String" -Objekt, das gemeinsam genutzt wird. – Jesper

Antwort

7

Ich würde tun, was Sie denken, ist am einfachsten und am klarsten. Eine Pattern wird häufig verwendet, wenn die Leistung einer Regex kritisch ist. Wenn Sie Ihre Anwendung nicht profiliert haben und es sich gezeigt hat, dass sie ein Problem darstellt, ist die Verwendung einer einfachen String wahrscheinlich in Ordnung.

+0

Eine Sache, die ich wiederbelebt habe, ist, dass du nur mit einer Schnur "zusammenpassen" kannst, du kannst nicht "finden", was ich gerne tun könnte. – Pureferret

+1

Sie können '(;. *" + Regex + ". *"); 'Statt finden. –

0

Der reguläre Ausdruck, den Sie für Vergleichszwecke verwenden möchten, muss in einen finit-Zustandsautomaten umgewandelt werden, der beliebigen Text akzeptiert, der dem von Ihnen angegebenen Muster entspricht.

Jedes Mal, wenn Sie einen regulären Ausdruck verwenden, zum Beispiel im (new String (""). Split ("") Ausdruck, wird im Hintergrund ein Muster konstruiert, nämlich ein endlicher Automat, der die Reihenfolge der Zeichen in der Zeichenfolge und versucht, die Eingabe übereinzustimmen

Wenn Sie einen regulären Ausdruck verwenden, den Sie häufig verwenden und Geschwindigkeit ist ein echtes Problem, dann ist es eine wichtige Beschleunigung, den endlichen Automaten zu behalten und nicht jedes Mal zu konstruieren Sie können dies tun, indem Sie das Pattern-Objekt zwischen aufeinanderfolgenden Aufrufen von Match auf verschiedenen Ausgabe-Strings speichern:

Die folgenden sollten einige weitere Einblicke bieten: http://en.wikipedia.org/wiki/Finite-state_machine

+0

Ich sehe nicht, wie die Initialisierung einer Zeichenfolge, die in ein gespeichertes Muster umgewandelt wird, sich so sehr von einem Muster unterscheidet, das aus einer Zeichenfolge initialisiert und gespeichert wird ... – Pureferret

Verwandte Themen