Saltar al contenido

RegEx que permite dígitos, guiones, comas

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úmero 0 para 999 y no permite números con ceros a la izquierda como 005
  • (?:-(?:[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 como 22 y 22-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 hecho 123), cambiar cada [0-9]1,3 fragmentarse en 0*[0-9]1,3
  • Si desea prohibir los ceros iniciales (012 debe fallar, cuando 12 o 0 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

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *