2009-07-16 15 views
22

Ich habe durch Kommata getrennte Liste von regulären Ausdrücken zu entkommen:Wie eine eckige Klammer für Musterzusammenstellung

.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z] 

ich getan auf dem Komma eine Spaltung habe. Jetzt versuche ich, diese Regex mit einem generierten Passwort abzugleichen. Das Problem ist, dass Pattern.compile nicht eckige Klammern, die nicht maskiert ist. Kann mir bitte eine einfache Funktion geben, die eine Zeichenfolge wie folgt akzeptiert: [0-9] und gibt die Escapezeichenfolge \[0-9\] zurück.

Antwort

11

Sie können die \ Q und \ E Sonderzeichen verwenden ... alles zwischen \ Q und \ E wird automatisch maskiert.

\Q[0-9]\E 
+0

Klingt ein bisschen perlish, wenn Sie mich fragen, haben Sie es in Java probiert (ich habe nicht, deshalb frage ich). – Fredrik

+1

Es ist auch in Java gültig: http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html (ctrl-F für "\ Q") – MatrixFrog

+5

Im Java String Literal Format es wäre "\\ Q [0-9] \\ E" oder "\\ Q" + regex + "\\ E". Aber die quote() -Methode macht das für Sie, und es behandelt korrekt Strings, die bereits \ E in ihnen haben. –

1

Pattern.compile() mag eckige Klammern gut. Wenn Sie die Zeichenfolge nehmen

".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]" 

und teilen Sie es auf Komma, am Ende mit fünf absolut gültige reguläre Ausdrücke auf: Die erste entspricht acht nicht-Line-Trennzeichen, die zweite entspricht einer ASCII-Ziffer, und so weiter. Es sei denn, Sie möchten wirklich Zeichenfolgen wie ".{8}" und "[0-9]" übereinstimmen, sehe ich nicht, warum Sie nichts entkommen müssen.

23

Aus irgendeinem Grund funktionierte die obige Antwort nicht für mich. Für diejenigen, die nach mir kommen, hier ist, was ich gefunden habe.

Ich habe erwartet, dass ein einzelner Backslash aus der Klammer entfernt wird. Sie müssen jedoch zwei verwenden, wenn Sie das Muster in einer Zeichenfolge gespeichert haben. Der erste umgekehrte Schrägstrich entkoppelt den zweiten in die Zeichenkette, so dass der Regex sieht \]. Da Regex nur einen umgekehrten Schrägstrich sieht, verwendet er es, um der eckigen Klammer zu entkommen.

\\] 

Im Regex, das wird eine einzelne schließende eckige Klammer übereinstimmen.

Wenn Sie beispielsweise versuchen, eine neue Zeile zu finden, verwenden Sie nur einen einzelnen umgekehrten Schrägstrich. Sie verwenden das Zeichenfolgen-Escape-Muster, um ein Zeilenumbruchzeichen in die Zeichenfolge einzufügen. Regex sieht nicht \n - es sieht das Newline-Zeichen und stimmt damit überein. Sie benötigen zwei umgekehrte Schrägstriche, da es sich nicht um eine Zeichenfolge-Escape-Sequenz handelt, sondern um eine Regex-Escape-Sequenz.

+2

Wenn ich darüber nachdachte, kam ich zu dem Schluss, warum das so ist: Die Regex ist eine Zeichenkette und was auch immer diese Regex abarbeitet, wird nach einem Backslah als Escape-Zeichen suchen. Da der Regex jedoch als String übergeben wird, müssen Sie auch den Backslah umgehen, um ihn richtig in einen String zu bekommen, und das ist der Grund, warum Sie zwei Backslashes benötigen – Raven

Verwandte Themen