Regex per abbinare 1234, 1324, 2341 (tutte le permutazioni di {1,2,3,4})

Sto implementando il seguente problema in ruby.

Ecco lo schema che voglio:

1234, 1324, 1432, 1423, 2341 e così via

cioè le cifre nel numero di quattro cifre dovrebbero essere tra [1-4] e dovrebbero anche essere non ripetitive.

per farti capire in un modo semplice prendo un modello a due cifre e la soluzione dovrebbe essere: 12, 21

cioè le cifre dovrebbero essere 1 o 2 e dovrebbero essere non ripetitive.

Per essere sicuro che non siano ripetitivi, voglio usare $ 1 per la condizione della mia seconda cifra, ma non funziona.

Per favore aiutatemi e grazie in anticipo.

Puoi usare questo ( vedi su rubular.com ):

^(?=[1-4]{4}$)(?!.*(.).*\1).*$ 

La prima asserzione assicura che sia ^[1-4]{4}$ , la seconda asserzione è un lookahead negativo che garantisce che non si possa eguagliare .*(.).*\1 , cioè un carattere ripetuto. La prima affermazione è “più economica”, quindi prima devi farlo.

Riferimenti

  • regular-expressions.info/Lookarounds e Backreferences

Domande correlate

  • Come funziona l’espressione regolare (?<=#)[^#]+(?=#) ?

Solo per una risatina, ecco un’altra opzione:

 ^(?:1()|2()|3()|4()){4}\1\2\3\4$ 

Man mano che ogni personaggio unico viene consumato, il gruppo che lo cattura dopo cattura una stringa vuota. I backreferences tentano anche di far corrispondere stringhe vuote, quindi se uno di essi non riesce, può solo significare che il gruppo associato non ha partecipato alla partita. E ciò avverrà solo se la stringa contiene almeno un duplicato.

Questo comportamento dei gruppi di cattura vuoti e dei riferimenti a ritroso non è ufficialmente supportato in alcun sapore regex, quindi è un emptor caveat . Ma funziona nella maggior parte di loro, incluso Ruby.

Penso che questa soluzione sia un po ‘più semplice

 ^(?:([1-4])(?!.*\1)){4}$ 

Guardalo qui su Rubular

 ^ # matches the start of the string (?: # open a non capturing group ([1-4]) # The characters that are allowed the found char is captured in group 1 (?!.*\1) # That character is matched only if it does not occur once more ){4} # Defines the amount of characters $ 

(?!.*\1) è un’asserzione lookahead , per garantire che il personaggio non venga ripetuto.

^ e $ sono ancore per abbinare l’inizio e la fine della stringa.