la siguiente es mi expresión regular
regex: /^[a-zA-Z]+-.*(?=.*\d)(?=.*[a-zA-Z]).*-[0-9]+-[a-zA-Z]+-[0-9]+$/
las reglas generales son: alfabeto-alfanumérico-número-alfabeto-número
tengo un problema en .*(?=.*\d)(?=.*[a-zA-Z]).*
el resultado esperado para obtener un resultado exitoso para la parte alfanumérica es
y fallar si
pero el resultado que obtengo es todo exitoso, incluye el resultado fallido esperado
Veo que usar la búsqueda anticipada también obtendrá la entrada después del guión (-) del alfanumérico que hizo que tuviera éxito, aunque no es el resultado esperado.
Tu podrías intentar
^[a-zA-Z]+-(?![a-zA-Z]+-|\d+-)[a-zA-Z0-9]+-\d+-[a-zA-Z]+-\d+$
Utiliza esta búsqueda anticipada negativa para comprobar que la segunda subsecuencia no solo está formada por alfabetos o números.
(?![a-zA-Z]+-|\d+-)
Alternativamente, puede usar esta anticipación positiva para verificar que la segunda subsecuencia esté formada por un dígito precedido de cualquier alfabeto o viceversa
(?=[a-zA-Z]+\d|\d+[a-zA-Z])
Es importante usar una búsqueda anticipada para verificarlo justo al comienzo de la subsecuencia, y no use .*
en esta situación, ya que podría consumir un -
y verificar la secuencia incorrecta detrás de él.
Puede consultar el resultado de la prueba aquí
Para la parte alfanumérica, puede afirmar no solo dígitos hasta el siguiente guión.
Usando una coincidencia que no distingue entre mayúsculas y minúsculas:
^[az]+-(?!\d+-)[az]*\d[az\d]*-\d+-[az]+-\d+$
^
Comienzo de cadena[az]+-
Combina 1+ caracteres az y -
(?!\d+-)
Anticipación negativa, afirmar no solo los dígitos seguidos de -
[az]*\d[az\d]*-
Coincide con caracteres opcionales az, coincide con un dígito y caracteres opcionales az o un dígito\d+-[az]+-\d+
Emparejar dígitos -
caracteres az -
dígitos$
Fin de la cadenaDemostración de expresiones regulares
const regex = /^[az]+-(?!\d+-)[az]*\d[az\d]*-\d+-[az]+-\d+$/i; [ "abc-abc-123-abc-123", "abc-123-123-abc-123", "abc-abcde-123-abc-123", "abc-12345-123-abc-123", "abc-ab23ca-123-abc-123", "abc-1abc23-123-abc-123" ].forEach(s => console.log(`${s} --> ${regex.test(s)}`) );
Por qué no:
/([A-Za-z]+[0-9]+|[0-9]+[A-Za-z]+)/ -- or -- /[A-Za-z]/.test(val) && /[0-9]/.test(val) var cases = [ "abc123", "123abc", "1abc23", "ab23ca", // fail "abcde", "12345", "abc-abc-123-abc-123", // not clear if these should fail? "abc-123-123-abc-123" ]; cases.forEach(val => { var ok = /([A-Za-z]+[0-9]+|[0-9]+[A-Za-z]+)/.test(val) //var ok = /[A-Za-z]/.test(val) && /[0-9]/.test(val); console.log(val, ok); });