Tengo una matriz de 5 números, me gustaría hacer coincidir siempre que haya tres del mismo número y dos del mismo número diferente en la matriz, la ubicación no importa. Las secuencias numéricas pueden ser cualquier cadena aleatoria de 5 números entre 1 y 5. Los ejemplos de coincidencias serían: 33322
24422
52225
44111
54545
*básicamente cualquier agrupación de 2 y 3 de los mismos números debe coincidir.
Lo mejor que he encontrado hasta ahora: ^([0-9])\1{2}|([0-9])\1{1}$
No soy tan bueno con expresiones regulares, cualquier ayuda sería muy apreciada.
Puedes usar
^(?=[1-5]{5}$)(?=.*(\d)(?:.*\1){2})(?=.*(?!\1)(\d).*\2)\d+$ ^(?=.*(\d)(?:.*\1){2})(?=.*(?!\1)(\d).*\2)[1-5]{5}$
Vea la demostración de expresiones regulares .
Si desea permitir dígitos, reemplace [1-5]
con \d
.
Detalles :
^
- comienzo de la cadena(?=[1-5]{5}$)
: debe haber cinco dígitos del 1
al 5
hasta el final de la cadena (esta búsqueda anticipada hace que las cadenas que no coinciden fallen más rápido)(?=.*(\d)(?:.*\1){2})
- una anticipación positiva que requiere cero o más caracteres tantos como sea posible, seguido de un dígito (capturado en el Grupo 1) y luego dos secuencias de cero o más caracteres tantos como sea posible y el mismo dígito capturado en el Grupo 1 inmediatamente a la derecha de la ubicación actual(?=.*(?!\1)(\d).*\2)
- una anticipación positiva que requiere cero o más caracteres tantos como sea posible, seguido de un dígito (capturado en el Grupo 2) que no es igual al dígito en el Grupo 1, y luego cero o más caracteres tantos como sea posible y el mismo dígito capturado en el Grupo 2 inmediatamente a la derecha de la ubicación actual\d+
- uno o más dígitos$
- final de la cadena.Hay muchas maneras de hacer eso. Una es hacer coincidir la siguiente expresión regular.
^(?=([1-5]).*\1)(?=.+(?!\1)([1-5]).*\2)(?:\1|\2){5}$
La idea es la siguiente.
La expresión regular se puede dividir de la siguiente manera.
^ # match beginning of string (?= # begin a positive lookahead ([1-5]) # match a digit 1-5 and save to capture group 1 .* # match zero or more characters \1 # match the digit in capture group 1 ) # end positive lookahead (?= # begin a positive lookahead .+ # match one or more characters (?!\1) # next character is not the digit in capture group 1 ([1-5]) # match a digit 1-5 and save to capture group 2 .* # match zero or more characters \2 # match the digit in capture group 2 ) # end positive lookahead (?:\1|\2){5}$ # match a 5-character string comprised of the digits # in the two capture groups
Aquí hay una segunda expresión que podría usarse:
^(?=([1-5])\1*(?!\1)([1-5])(?:\1*\2){1,2}\1*$).{5}$