2016-08-09 2 views
1

ich einen regulären Ausdruck haben:Wie meine regulären Ausdruck ändern

string DefaultInternalUseridPattern = "^(?i)((CEU)|(APA)|(NAM))\\\\(((ADM.){0,1}([a-z]{8}))|((SVC.){0,1}((CEU.)|(APA.)|(NAM.)|(HEI.))[a-z]*))$"; 

Ich möchte den letzten Teil ersetzen: (. CEU) | (. APA) | (. NAM) | (. HEI)

Mit etwas, das zu 3 Brief übereinstimmt und dann nicht die Lösung für mein Problem einer .

ich ein paar Sachen ausprobiert, aber bekommen.

+2

Ein Zeichen '.' gemeint ist, Recht? Dann muss es entkommen. Probieren Sie ['@^^ (? I) (CEU | APA | NAM) \\ ((ADM \.)? ([Az] {8}) | (SVC \.)? ([AZ] {3} \.) [az] *) $ "'] (http://regexstorm.net/tester?p=%5e (% 3fi) (CEU% 7cAPA% 7cNAM)% 5c% 5c ((ADM% 5c.)% 3f (% 5ba-z% 5d% 7b8% 7d)% 7c (SVC% 5c.)% 3f (% 5bA-Z% 5d% 7b3% 7d% 5c.)% 5ba-z% 5d *)% 24 & i = Text). Verwenden Sie ein wörtliches Zeichenfolgenliteral. Wenn Sie dort nur Großbuchstaben suchen müssen, müssen Sie sie in einer '(? -i: [A-Z] {3} \.)' Gruppe verwenden. –

+0

Könnten Sie bitte etwas Text zum Testen bereitstellen? –

Antwort

3

Ihr Ausdruck ist mit einfangenden Gruppen überladen, ich bezweifle, dass Sie sie verwenden und empfehlen, diese überflüssigen zu entfernen. Das wird weitere Manipulationen damit vereinfachen.

Beachten Sie, dass Literalpunkte im Muster maskiert werden müssen.

Ich sehe auch, dass Sie ein reguläres String-Literal verwenden, während ein Verbatim-String-Literal viel komfortabler ist, um Regex-Muster in C# zu definieren.

Versuchen

@"^(?i)(CEU|APA|NAM)\\((ADM\.)?([a-z]{8})|(SVC\.)?([A-Z]{3}\.)[a-z]*)$" 
                ^^^^^^^^^^ 

die demo here See, änderte ich die 4 alternative Gruppe in [A-Z]{3}\..

Beachten Sie, dass wenn Sie nur Großbuchstaben dort übereinstimmen müssen, müssen Sie sie in einer (?-i:[A-Z]{3}\.) Gruppe verwenden.

+0

Hat es funktioniert? ... –

0

Sie können alle nicht benötigte Einfanggruppen loszuwerden und benutzen Sie diese

Raw: ^(?i)(?:CEU|APA|NAM)\\(?:(?:ADM\.)?[a-z]{8}|(?:SVC\.)?[A-Z]{3}\.[a-z]*)$
Verbatim: @"^(?i)(?:CEU|APA|NAM)\\(?:(?:ADM\.)?[a-z]{8}|(?:SVC\.)?[A-Z]{3}\.[a-z]*)$"

Expanded
^
(?i)      # Be careful here, this says case insensitive 
          # for all subsequent letter matching. 
(?: CEU | APA | NAM) 
\\ 
(?: 
     (?: ADM \.)? 
     [a-z]{8} 
    | 
     (?: SVC \.)? 
     [A-Z]{3} \. 
     [a-z]* 
) 
$ 
+0

Es gibt nichts Schlechtes bei der Verwendung von Erfassungsgruppen in einem .NET-Regex. Das 'RegexOptions.ExplicitCapture' Flag stellt sicher, dass kein Stack für unbenannte, nummerierte, einfangende Gruppen erstellt wird. Siehe MSDN-Referenz: [* Dadurch können unbenannte Klammern als nicht-einfangende Gruppen ohne die syntaktische Ungeschicklichkeit des Ausdrucks "(?: ...)". *] (Https://msdn.microsoft.com/de-de/library/system .text.regularexpressions.regexoptions (v = vs.110) .aspx) –

+0

Du redest immer mit mir, Kumpel, aber ich habe keine Ahnung, was du sagst. Dot-Net Group Zählung oder Reihenfolge hat eine Standardeinstellung, wenn Sie das meinen. Was den _stack_ betrifft, sollten Sie, sofern Sie nicht der Autor dieser Engine sind, von ihnen herausfinden. – sln