mi colega y yo intentamos construir un Regex (Javascript) para validar un campo de entrada para un formato específico. El campo debe ser una lista separada por comas de declaraciones de puerto y podría verse así:
TCP/53,UDP/53,TCP/10-20,UDP/20-30
Probamos esta expresión regular:
/^[TCP/\d+,|UDP/\d+,|TCP/\d+\-\d+,|UDP/\d+\-\d+,]*[TCP/\d+|UDP/\d+|TCP/\d+\-\d+|UDP/\d+\-\d+]$/gla expresión regular coincide, pero también coincide con otras cadenas, como esta:
TCP/53UDP53,TCP/10-20UDP20-30
¡Gracias por cualquier orientación!
No necesita todas esas alternancias, y el [ ] no se usa para agrupar de esa manera. También puede hacer que la parte - y los dígitos sean opcionales usando la agrupación (?:...)?
Para que coincida con ese formato de cadena:
^(?:TCP|UDP)\/\d+(?:-\d+)?(?:,(?:TCP|UDP)\/\d+(?:-\d+)?)*$El patrón coincide:
^ Comienzo de cadena(?:TCP|UDP) Coincide con una de las alternativas\/\d+(?:-\d+)? Coincidencia / 1+ dígitos y opcionalmente - y 1+ dígitos(?: Grupo de no captura para repetir como una parte completa,(?:TCP|UDP)\/\d+(?:-\d+)? Haga coincidir , y repita el mismo patrón)* Cierre el grupo de no captura y, opcionalmente, repita (si debe haber al menos 1 coma, cambie el * a + )$ Fin de la cadenaAlternativa: divida la cadena, use Array.filter y un RegExp relativamente simple para probar.
const valid = `TCP/53,UDP/53,TCP/10-20,UDP/20-30`; const invalid = `TCP/53UDP53,TCP/10-20UDP20-30`; console.log(`${valid} ok? ${checkInp(valid)}`); console.log(`${invalid} ok? ${checkInp(invalid)}`); function checkInp(str) { return str.split(`,`) .filter(v => /^(TCP|UDP)\/\d+(?:-\d+)*$/.test(v)) .join(`,`) .length === str.length; }