Estoy tratando de asegurarme de que solo se use un tipo de carácter especial (punto y coma, coma o espacio) en una cadena.
Caso válido:
por ejemplo, esto debería coincidir ya que solo usa un tipo de carácter especial (punto y coma): https://hello.com/example1;https://hello.com.com/example2;https://hello.com.com /ejemplo3
Esto debería fallar ya que mezcla dos tipos de caracteres especiales (espacio y punto y coma)
https://hola.com/ejemplo1; https://hola.com.com/ejemplo2 ; https://hola.com.com/ejemplo3
Este es mi código:
const myValidation = yup .string() .matches(/^([A-Za-z0-9://,\\.]|[A-Za-z0-9:// \\.]|[A-Za-z0-9://;\\.])+$/, 'Please separate each with a comma, space or semicolon') .required(); Cuando solo tengo /^([A-Za-z0-9://,\\.]+$/ funciona correctamente para hacer coincidir solo la cadena si solo tiene una coma como carácter especial: https://hello.com/example1,https://hello.com.com/example2,https://hello.com.com/example3
pero tan pronto como agrego las otras condiciones /^([A-Za-z0-9://,\\.]|[A-Za-z0-9:// \\.]|[A-Za-z0-9://;\\.])+$/ comienza a permitir caracteres especiales de punto y coma, espacio y coma en la cadena al mismo tiempo (el caso no válido)
Para los casos válidos, puede usar un grupo de captura con una referencia inversa \1 para asegurarse de que el "carácter especial" sea el mismo delimitador entre las coincidencias.
^[A-Za-z0-9:/.]+(?:([ ,;])[A-Za-z0-9:/.]+(?:\1[A-Za-z0-9:/.]+)*)?$El patrón coincide:
^ Comienzo de cadena[A-Za-z0-9:/.]+ Match 1+ de los caracteres permitidos(?: Grupo de no captura para hacer coincidir como una parte completa([ ,;]) Grupo de captura 1 , haga coincidir uno de los delimitadores[A-Za-z0-9:/.]+ Match 1+ de los caracteres permitidos(?:\1[A-Za-z0-9:/.]+)* Opcionalmente, repetir una referencia inversa al mismo delimitador y nuevamente 1+ de los caracteres permitidos)? Cierre el grupo de no captura y hágalo opcional$ Fin de la cadenaVea una demostración de expresiones regulares .
const regex = /^[A-Za-z0-9:/.]+(?:([ ,;])[A-Za-z0-9:/.]+(?:\1[A-Za-z0-9:/.]+)*)?$/; [ "https://hello.com/example1;https://hello.com.com/example2;https://hello.com.com/example3", "https://hello.com/example1; https://hello.com.com/example2 ;https://hello.com.com/example3", "https://hello.com/example1" ].forEach(s => console.log(`${regex.test(s)} --> ${s}`) );Si debe haber al menos un solo delimitador presente, puede acortar el patrón a:
^[A-Za-z0-9:/.]+([ ,;])[A-Za-z0-9:/.]+(?:\1[A-Za-z0-9:/.]+)*$ Si las cadenas deben comenzar con http:// o https:// , podría usar:
^https?:\/\/[A-Za-z0-9:/.]+(?:([ ,;])https?:\/\/[A-Za-z0-9:/.]+(?:\1[A-Za-z0-9:/.]+)*)?$Vea otra demostración de expresiones regulares .
function isOnlyOne() { let s = "zy,,aemnofgbcjkhilpqasdfrstuvrhfwx"; console.log([...new Set(s.split("").filter(e => e.match(/[;, ]/)))].length==1); //return [...new Set(s.split("").filter(e => e.match(/[az]/)))].length==26; }