2016-11-21 7 views
1

Я просто сопоставил строку с регулярным выражением.Поиск дубликатов в группе захвата RegEx?

Я хочу совместить строку, содержащую 3 комбинации букв/цифр. Он может содержать A, B или L, следующий цифрой 1-3. (в случае L, 1-4)

Мой вопрос: Я не хочу соответствовать строке, когда письмо соответствует несколько раз. Таким образом, A, B и L могут возникать только один раз.

Мое выражение до сих пор:

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

Teststrings, которые соответствуют в данный момент:

L2B1A3 
B2L1A2 
A1B1L4 
A1A2A3 

строк, которые не соответствуют в данный момент:

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

Строки, которые я не соответствуют (совпадение сейчас):

A2A2A3 (The A, B and L only may occur one time!) 
+1

Как насчет этого '^ (?!. * [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 он не хочет соответствовать 'A1A2A3' –

+0

@AvinashRaj: Если бы вопрос был ясен, я бы опубликовал ответ. Возможно, OP нуждается в ['^ (?! ([ALB]). * \ 1) (?: [AB] [1-3] | L [1-4]) {3} $'] (https: // regex101 .com/г/uZflbO/5). ** Milkmannetje **, не могли бы вы предоставить исчерпывающий тест? Какие строки действительны, а какие нет? –

ответ

3

Если я правильно понял, это будет работать:

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

который дает

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

ломка:

 
^    # 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 

Тот факт, что три lookaheads должны быть удовлетворены в то время как основная группа должна соответствовать три раза , а также заботиться о том, чтобы буквы не были удвоены.

+0

Да, место на! Это именно то, что мне нужно! – Milkmannetje

1

Просто предлагая альтернативный метод.

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

Отрицательная опережения с обратной ссылкой, чтобы захватить группа 1 (?!.*([A-Z]).*\1) гарантирует, что заглавная буква происходит только один раз в строке.

Преимущество в том, что регулярное выражение будет более кратким, когда в регулярное выражение добавляется больше букв, чем ABL.