Esta es la contestación más correcta que encomtrarás brindar, sin embargo estúdiala pausadamente y valora si es compatible a tu proyecto.
Solución:
Puedes usar esta expresión regular,
^(?:[1-9]dd|[1-9]?d)(?:-(?:[1-9]dd|[1-9]?d))?(?:,s?(?:[1-9]dd|[1-9]?d)(?:-(?:[1-9]dd|[1-9]?d))?)*$
Explicación:
^
– Inicio de string(?:[1-9]dd|[1-9]?d)
– Representa un número0
para999
y no permite números con ceros a la izquierda como005
(?:-(?:[1-9]dd|[1-9]?d))?
– Opcionalmente también permite un número separado por guión-
así que junto con el primer dígito de expresión regular, admite números como22
y22-33
etc.(?:,s?(?:[1-9]dd|[1-9]?d)(?:-(?:[1-9]dd|[1-9]?d))?)*
– Esta parte solo admite comas separadas opcionalmente seguidas de un espacio en blanco y todo cero o más veces$
– Final de string
podría haber usado d1,3
para representar un número de 0
para 999
pero esto permitiría números como 004
que no parece tener permitido ver sus datos de muestra. Pero si de hecho está bien permitir números como 004
o 04
entonces puedes reemplazar [1-9]dd|[1-9]?d
con d1,3
en mi expresión regular para hacerlo simple.
Demostración de expresiones regulares
Puedes probar
^[0-9]1,3(?:-[0-9]1,3)?(?:,s?[0-9]1,3(?:-[0-9]1,3)?)*$
patrón donde
^ String start
0*[0-9]1,3 1 to 3 digits
(?:-[0-9]1,3)? Possible minus (-) followed 1 to 3 digits (e.g. -456)
?:,s? Comma and at most one whitespace
[0-9]1,3(?:-[0-9]1,3)?)* 1 to 3 digits or range repeated zero or more times
$ End of string
Manifestación:
string pattern =
@"^[0-9]1,3(?:-[0-9]1,3)?(?:,s?[0-9]1,3(?:-[0-9]1,3)?)*$";
string[] tests = new string[]
"123",
"1234",
"123-456",
"123,456",
"1-100,134,200",
"1,18,100",
"1, 18, 100",
"1, 18,100",
"1-,18,100",
"-2,18,100",
"1,,18,100",
"1, ,18,100",
",2,18,100",
"1,18,100,",
;
string[] results = tests
.Select(test => $"test,-20 --> (Regex.IsMatch(test, pattern) ? "PASS" : "FAIL")")
.ToArray();
string report = string.Join(Environment.NewLine, results);
Console.Write(report);
Salir:
123 --> PASS
1234 --> FAIL
123-456 --> PASS
123,456 --> PASS
1-100,134,200 --> PASS
1,18,100 --> PASS
1, 18, 100 --> PASS
1, 18,100 --> FAIL
1-,18,100 --> FAIL
-2,18,100 --> FAIL
1,,18,100 --> FAIL
1, ,18,100 --> FAIL
,2,18,100 --> FAIL
1,18,100, --> FAIL
Editar:
- Si desea permitir arbitrariamente muchos ceros a la izquierda (por ejemplo,
000123
que es de hecho123
), cambiar cada[0-9]1,3
fragmentarse en0*[0-9]1,3
- Si desea prohibir los ceros iniciales (
012
debe fallar, cuando12
o0
debe) pasar, cambiar cada[0-9]1,3
fragmentarse en(?:0|[1-9][0-9]0,2)
Prueba el siguiente patrón: ^(?:d1,3-d1,3|d1,3)(?:, ?(?:d1,3-d1,3|d1,3))*$
Explicación:
^
– comienzo del partido de un string
(?:...)
– grupo que no captura
d1,3
– coincidencia entre 1 y 3 dígitos
-
– coincide con guión literalmente
|
– alternancia, empareja lo que está a la derecha (d1,3
) o lo que a la izquierda (d1,3-d1,3
)
, ?
– partido ,
seguido de cero o un espacio
*
– partido (?:, ?(?:d1,3-d1,3|d1,3))
cero o más veces
$
– final del partido de un string
Manifestación