ruby - variaciones - tipos de permutaciones
Regex para que coincida con 1234, 1324, 2341(todas las permutaciones de{1,2,3,4}) (3)
Estoy implementando el siguiente problema en ruby.
Este es el patrón que quiero:
1234, 1324, 1432, 1423, 2341 y así sucesivamente
es decir, los dígitos del número de cuatro dígitos deben estar entre [1-4] y también deben ser no repetitivos.
Para hacerte entender de una manera simple, tomo un patrón de dos dígitos y la solución debería ser: 12, 21
es decir, los dígitos deben ser 1 o 2 y no deben repetirse.
Para asegurarme de que no sean repetitivos, quiero usar $ 1 para la condición de mi segundo dígito, pero no funciona.
Por favor ayúdenme y gracias de antemano.
Solo por una risita, aquí hay otra opción:
^(?:1()|2()|3()|4()){4}/1/2/3/4$
A medida que se consume cada carácter único, el grupo de captura que lo sigue captura una cadena vacía. Las retrorreferencias también intentan hacer coincidir cadenas vacías, por lo que si una de ellas no tiene éxito, solo puede significar que el grupo asociado no participó en la coincidencia. Y eso solo ocurrirá si la cadena contiene al menos un duplicado.
Este comportamiento de grupos de captura vacíos y backreferences no es oficialmente compatible con ningún tipo de regex, así que caveat emptor . Pero funciona en la mayoría de ellos, incluido Ruby.
Creo que esta solución es un poco más simple
^(?:([1-4])(?!.*/1)){4}$
^ # 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)
es una afirmación de anticipación , para garantizar que el personaje no se repita.
^
y $
son anclajes para coincidir con el inicio y el final de la cadena.
Puedes usar esto ( ver en rubular.com ):
^(?=[1-4]{4}$)(?!.*(.).*/1).*$
La primera afirmación asegura que es ^[1-4]{4}$
, la segunda afirmación es una anticipación negativa que asegura que no puede coincidir .*(.).*/1
, es decir, un carácter repetido. La primera afirmación es "más barata", por lo que debes hacer eso primero.