2016-04-25 2 views
-3

Ich möchte mehrzeiligen Text den Anfang der Zeichenfolge cc-kk Ende finden, und müssen die Zeichenfolge c3 und c4, schließen ein, aber die Zeichenfolge dd oder ee nicht enthalten kann, die folgende Testdaten:Wer kann mir helfen, einen regulären Ausdruck zu schreiben?

t1 b1 cc 
c3 c4 z1 
t3 dd kk 

t4 b2 cc 
c4 c3 z2 
t6 ee kk 

t7 b3 cc 
c3 c4 z3 
t9 ff kk 

t7 b3 cc 
c4 c3 z3 
t9 ff kk 

erwartete Ergebnisse und nur:

cc 
c3 c4 z3 
t9 ff kk 

cc 
c4 c3 z3 
t9 ff kk 

schrieb ich einen regulären Ausdruck (C#), aber das Ergebnis ist nicht zu erwarten.

Antwort

2

Sie müssen die Regex-Engine vor jedem einzelnen Zeichen auf den Zustand prüfen lassen.

@"(?s)\bcc\b(?:(?!dd|ee).)*?\bkk\b" 

DEMO

(?:(?!dd|ee).)*? sollte jedes Zeichen, aber nicht von dd oder ee, null oder mehr Male (nicht-gierig). \

Update:

(?s)\bcc\b(?:(?!\bdd\b|\bee\b).)*?\bc3\b(?:(?!\bdd\b|\bee\b).)*?\bkk\b 
+0

@MikeMB ein bisschen hinzugefügt. Sie können die Erklärung jedes Regex-Musters auf der rechten Seite des Demo-Links sehen, den ich angehängt habe. Wenn Sie Zweifel an dieser Erklärung haben, zögern Sie nicht mich zu fragen. –

+0

Vielen Dank –

+0

für mehr Genauigkeit, '@" (? S) \ bcc \ b (?: (?! \ B (?: Dd | ee) \ b).) *? \ bkk \ b "' –

1

Versuchen Sie, diese

cc(?:\s(?!dd|ee)\w{2})*\skk 

Regex demo

Erläuterung:
(?: …): Nicht-Erfassung Gruppe sample
\s: "Leerzeichen": Leerzeichen, Tabulator, Newline, Wagenrücklauf, vertikale Registerkarte sample
(?!…): Negative Look-Ahead-sample
|: Makeln/OR Operand sample
\w: "Wortzeichen": ASCII Buchstaben, Zahlen oder unterstreichen sample
*: Null oder mehrmals sample

(?!dd|ee)\w{2} 2 Charakter aber dd oder eesample

Verwandte Themen