Necesito aceptar una cadena que defina cuántos códigos postales usará el usuario.
Ejemplos:
1000:12001000,120001010:1015,1019,1025:1027 devolverá [1010,1011,1012,1013,1014,1015,1019,1025,1026,1027] Necesito verificar esa cadena.
Usé esto para verificar pero no funcionó
/(\d{4}(:|,){0,1}\d{4})/gmComience con una frase básica que coincida con #### o ####:####
\d{4}(:\d{4})?Luego extiéndalo para que coincida con cualquier número de ellos en una lista separada por comas:
\d{4}(:\d{4})?(,\d{4}(:\d{4})?)* Finalmente, rodee con ^ y $ para validar toda la línea.
^(\d{4}(:\d{4})?)(,(\d{4}(:\d{4})?))*$Por mucho que traté de simplificar un Regex, aquí hay un verdadero validador para sus cadenas específicas.
Parece un poco largo ya que coincide con un rango de 1000→1200 : 1(?:[01]\d{2}|200)
/^1(?:[01]\d{2}|200)(?::1(?:[01]\d{2}|200)(?!:)|,1(?:[01]\d{2}|200))*$/gRegex101.com ejemplo y descripción
sin el rango
el Regex es más simple pero también coincidirá con cualquier número de cuatro dígitos como 0000 , 9999 :
/^\d{4}(?::\d{4}(?!:)|,\d{4})*$/gRegex101.com ejemplo y descripción
Más simple, pero no para ser utilizado como validador
La solución más sencilla sería
/^\d{4}(?:[,:]\d{4})*$/g Regex101.com ejemplo y descripción
pero como puede ver, coincidirá con muchas entradas incorrectas como el 1000:1005:1020 inválido (dos :
Debe expandir estas coincidencias después de encontrar la coincidencia. Supongo que la cadena se valida antes, si no se usa if (/^\d+(?:[:,]\d+)*$/.test(s)) { ... } .
let s = '1010:1015,1019,1025:1027'; const chunks = s.replace(/(\d+):(\d+)/g, (_,$1,$2) => Array.from( new Array(Number($2)-Number($1)), (x, i) => i + Number($1)) .join(",")).split(','); console.log(chunks); La Array.from(new Array(Number($2)-Number($1)), (x, i) => i + Number($1)) genera un rango de números entre los valores del Grupo 1 y el Grupo 2 obtenidos con el /(\d+):(\d+)/g expresión regular.