2016-11-21 8 views
1

Ich habe gerade eine Zeichenfolge mit einem regulären Ausdruck abgeglichen.Suche nach Duplikaten in einer RegEx-Erfassungsgruppe?

Ich möchte eine Zeichenfolge, die 3 Buchstaben/Ziffern-Kombinationen enthält, übereinstimmen. Es kann ein A, B oder L enthalten, gefolgt von einer Ziffer 1-3. (im Falle eines L, 1-4)

Meine Frage: Ich möchte die Zeichenfolge nicht übereinstimmen, wenn ein Buchstabe mehrere Male übereinstimmt. Also können A, B und L nur einmal vorkommen. so weit

Mein Ausdruck:

(?:[A|L|B](?(?<=L)[1-4]|[1-3])){3} 

Teststrings, die in diesem Moment entsprechen:

L2B1A3 
B2L1A2 
A1B1L4 
A1A2A3 

Strings, die in diesem Moment nicht übereinstimmen:

L4B4A1 (Only L can have a digit that's 4) 
L2A1B (Missing digit) 

Strings, die ich will nicht übereinstimmen (jetzt passend):

+1

Wie wäre es damit?^(?!. * [AB] 4) ([ALB]) [1-4] (?: (?! \ 1) ([ALB]) [1-4]) (? : (?! \ 1 | \ 2) ([ALB]) [1-4]) $ '? demo https://www.regex101.com/r/VKGj0q/1 –

+1

@ WiktorStribiżew er nicht mit 'A1A2A3' übereinstimmen möchte –

+0

@AvinashRaj: Wenn die Frage klar wäre, hätte ich die Antwort gepostet. Vielleicht braucht OP ['^ (?! ([ALB]). * \ 1) (?: [AB] [1-3] | L [1-4]) {3} $'] (https: // regex101 .com/r/uZflbO/5). ** Milkmannetje **, könnten Sie bitte den umfangreichen Testfall zur Verfügung stellen? Welche Strings sind gültig und welche nicht? –

Antwort

3

Wenn ich das richtig verstanden, das funktionieren würde:

^(?=.*A)(?=.*B)(?=.*L)([AB][1-3]|L[1-4]){3}$ 

die gibt

 
L2B1A3 - match 
B2L1A2 - match 
A1B1L4 - match 
A1A2A3 - no match 
L4B4A1 - no match 
L2A1B - no match 

Pause-down:

 
^    # start of string 
(?=.*A)  # A must occur anywhere in the string 
(?=.*B)  # B must occur anywhere in the string 
(?=.*L)  # L must occur anywhere in the string 
(   # begin capturing group 
    [AB][1-3] # A or B and 1-3 
    |   # or 
    L[1-4]  # L and 1-4 
){3}   # end group 
$    # end of string 

Die Tatsache, dass die drei Lookaheads erfüllt sein müssen, während die Hauptgruppe drei Mal übereinstimmen muss sowie dauert Sorge für die Bedingung, dass die Buchstaben nicht verdoppelt werden müssen.

+0

Ja, genau richtig! Genau das brauche ich! – Milkmannetje

1

Nur eine alternative Methode anbieten.

^(?!.*([A-Z]).*\1)(?:[AB][1-3]|L[1-4]){3}$ 

Die negative Vorschau mit einem Rückreferenzierung zu erfassen Gruppe 1 (?!.*([A-Z]).*\1) stellt sicher, dass ein Großbuchstabe in der Zeichenkette nur einmal vorkommt.

Der Vorteil ist nur, dass die Regex präziser wird, wenn mehr Buchstaben als ABL der Regex hinzugefügt werden.

Verwandte Themen