/ / Regex separados por comas dígitos individuales ordenados ascendentes - c #, regex, csv, orden, dígito

Regex comas separados por un solo dígito ordenados ascendente - c #, regex, csv, orden, dígito

Estoy intentando escribir una expresión regular para validar la entrada del usuario (asp.net, c #) que tiene las siguientes condiciones:

- single digits within a range of 1 - 6
- comma separated, but list should not begin or end with a comma
- digits cannot be repeated
- digits should be in ascending order

Por ejemplo:

- 1,2,3,4,5,6   - valid
- 2,5,6         - valid
- 4             - valid
- 2,5,6,        - invalid
- 3,6,5         - invalid
- 2,2,5,6       - invalid

Hasta ahora tengo:

^((1,)?(2,)?(3,)?(4,)?(5,)?(6)?)$

El problema con esto es que los números del 1 al 5 deben ir seguidos de una coma que, si son el único número que se ingresa, no es correcto.

Respuestas

2 para la respuesta № 1

Puedes usar b para asegurarse de que está en el límite de la palabra, y ,* tener una coma O sin coma. Esto da como resultado el trabajo, aunque bastante largo.

^((1)?(b,?2)?(b,?3)?(b,?4)?(b,?5)?(b,?6)?)$

0 para la respuesta № 2

(Esta es una respuesta tonta)

Dado que hay seis valores, y cada uno puede estar presente o no, hay 2^6 = 64 posibles valores correctos; excepto que supongo que queremos excluir la posibilidad de que no haya ningún número presente, por lo que solo hay 63 posibles valores correctos. Esta expresión regular les permite y solo a ellos:

^(6|5|5,6|4|4,6|4,5|4,5,6|3|3,6|3,5|3,5,6|3,4|3,4,6|3,4,5|3,4,5,6|2|2,6|2,5|2,5,6|2,4|2,4,6|2,4,5|2,4,5,6|2,3|2,3,6|2,3,5|2,3,5,6|2,3,4|2,3,4,6|2,3,4,5|2,3,4,5,6|1|1,6|1,5|1,5,6|1,4|1,4,6|1,4,5|1,4,5,6|1,3|1,3,6|1,3,5|1,3,5,6|1,3,4|1,3,4,6|1,3,4,5|1,3,4,5,6|1,2|1,2,6|1,2,5|1,2,5,6|1,2,4|1,2,4,6|1,2,4,5|1,2,4,5,6|1,2,3|1,2,3,6|1,2,3,5|1,2,3,5,6|1,2,3,4|1,2,3,4,6|1,2,3,4,5|1,2,3,4,5,6)$

Por favor, no utilices esto. Nos harás quedar mal a los dos.


0 para la respuesta № 3

Versión no regex. Simple y preciso

string str = ",1,  2,3, 4, 5, 6";
bool valid = false;
var invalidString = str.Split(",").Any(p =>
{
int num = 0;
return int.TryParse(p, out num);
});
if (!invalidString)
{
List<int> list = str.Split(",").Select(p => int.Parse(p)).ToList();
var sorted = list.SequenceEqual(list.OrderBy(p => p));
var hasDuplicates = list.Count != list.Distinct().Count();
valid = sorted && !hasDuplicates;
}

0 para la respuesta № 4

Estrictamente para propósitos de aprendizaje, divida el problema en pedazos.

Debe formarse como un dígito seguido de cero o más comas más dígitos.

^d(?:,d)*$

Solo hay 6 dígitos y deben estar en orden ascendente. Así que solo enuméralos y sus comas intermedias; cada uno de los cuales es opcional.

^1?,?2?,?3?,?4?,?5?,?6?$

La dificultad es que ambos de los regulares anterioreslas expresiones deben coincidir al mismo tiempo. Podemos usar cabezas de aspecto de ancho cero en una de ellas. Esto hará el partido pero no "consumirá" ningún personaje. Por lo tanto, después de que coincida, la siguiente parte de la expresión regular comenzará en el mismo lugar que la mirada hacia adelante. La mirada hacia el futuro se logra envolviendo una expresión en (?= y ")". Dando:

(?=^d(?:,d)*$)

La combinación de las dos expresiones regulares da lo siguiente:

(?=^d(?:,d)*$)^1?,?2?,?3?,?4?,?5?,?6?$