2015-12-29 8 views
5

Ich habe in letzter Zeit eine Menge wirklich interessante Sachen über Regex gelesen. Vor allem über creating your own regex boundariesWie kann ich zwei Großbuchstaben, denen keine Sonderzeichen vorangestellt sind, mit Regex kombinieren?

Eine Sache, die ich nicht gesehen habe getan (ich bin 100% wurde getan, aber ich habe keine Beispiele bemerkt) ist, wie eine Regex-Übereinstimmung auszuschließen, wenn es vorausgeht durch ein 'Sonderzeichen' wie &! % $ #. Zum Beispiel:

Wenn ich die Regex verwenden (Hinweis: Dies ist aus C#)

([A-Z]{2,}\\b) 

Es wird keine Großbuchstaben entsprechen, die zwei oder mehr in der Länge sind, und verwenden Sie die \b Grenze um sicherzustellen, dass die beiden Großbuchstaben beginnen nicht mit anderen Buchstaben oder enden mit ihnen. Aber hier ist, wo ich bin nicht sicher, wie diese sich verhalten würde:

AA -Match

sAB -Nr Spiel

ACs -Nr Spiel

AD - Übereinstimmung

AF! -Match

Ich möchte wissen, wie man nur zwei oder mehr Großbuchstaben wählt, denen kein Kleinbuchstabe/Zahl/Symbol vorangestellt wird, oder gefolgt von einem Kleinbuchstaben/einer Zahl/Sonderzeichen.

Ich habe gesehen, wie Leute Leerzeichen verwenden, also stellen Sie sicher, dass die Zeichenfolge mit einem Leerzeichen beginnt oder endet, aber das funktioniert nicht, wenn es am Anfang oder am Ende einer Zeile steht.

So wird der Ausgang I für aus dem obigen Beispiel aussehen würde wäre:

AA -Match

sAB -Nr Spiel

ACs -Nr Spiel

! AD -Nein Übereinstimmung

AF! -Nein Spiel

Jede Hilfe wird geschätzt.

+0

Hört sich an, als ob Sie ein Wort Grenze auf beiden Seiten der 2 Großbuchstaben wollen? –

+0

Welche Art von "Symbol" meinst du? '\ p {S}'? –

+0

Symbol war wahrscheinlich das falsche Wort. Ich hätte Sonderzeichen sagen sollen, wie ich früher in der Frage "! @ # $%^& *()" – trueCamelType

Antwort

2

Sie müssen nur ein Lookbehind verwenden und einen Look-Ahead:

(?<![a-z\[email protected]#$%^&*()])[A-Z]{2,}(?![a-z\[email protected]#$%^&*()]) 

Siehe regex demo

Die (?<![a-z\[email protected]#$%^&*()]) Lookbehind stellen sicher, es gibt keinen Klein Buchstaben ([a-z]), Ziffern (\d) oder von Ihnen definierte Sonderzeichen. Wenn es eine gibt, ist die Übereinstimmung fehlgeschlagen, nichts wird zurückgegeben.

Die (?![a-z\[email protected]#$%^&*()]) Lookahead schlägt auch eine Übereinstimmung fehl, wenn die gleichen Zeichen nach den Buchstaben von ALLCAPS gefunden werden.

Weitere Details unter Lookahead and Lookbehind Zero-Length Assertions here.

+1

Danke Sehr, das war eine großartige Erklärung. Ich hatte überhaupt nicht \ d verwendet, und jetzt kann ich Lookbehind und Lookahead mehr erforschen. Vielen Dank! – trueCamelType

+1

Neben '\ d' können Sie in C#' \ p {N} 'verwenden, um Ziffern zu finden, aber' \ d' ist kürzer. Nur eine Randnotiz: Das '\ d' wird auch mit allen Unicode-Ziffern (Arabisch, Hebräisch, Hindi usw.) übereinstimmen, so dass Sie immer noch auf ASCII-Zeichen mit' [0-9] 'beschränken möchten. –

1

Ich denke, es ist genug, um das Muster, das Sie haben, mit einer Negation von Kleinbuchstaben und irgendwelchen Symbolen, die Sie ausschließen möchten, voranzustellen. Mein Beispiel schließt nur ! aus, aber Sie können der Liste entsprechend hinzufügen. ^ in Klammern negiert, was in ihnen ist.So zum Beispiel, können Sie das Muster einge

/[^a-z!][A-Z]{2,}[^a-z!]/g