Estoy creando un verificador de IBAN que actualmente funciona bien: reconoce los primeros 2 caracteres (por ejemplo, DE o GB) y, de acuerdo con el código de país coincidente, verifica la estructura de IBAN específica (DE va seguido solo de números, mientras que GB tiene algunas letras en algún lugar ahí). Entonces esas cosas se revisan perfectamente bien.
Aquí el código de trabajo sin respaldo: https://regex101.com/r/HqThjy/1
^(?:GB\d{2}[AZ]{4}\d{14}|DE\d{20})$ this matches: DE12312341212312312312 GB12ASDF12312312312311Pero quiero integrar un respaldo para cuando ninguno de mis países establecidos que quiero verificar específicamente (vamos a seguir con DE y GB) coinciden, por ejemplo, Noruega con su código NO . Mi idea actual de una alternativa termina mi ejemplo con una condición ELSE, pero esto también coincide con una cadena DE y GB falsa: https://regex101.com/r/HqThjy/3
^(?:GB\d{2}[AZ]{4}\d{14}|DE\d{20})|[AZ]{2}(?:[AZ]|\d){13,}$ this matches: DE12312341212312312312 GB12ASDF12312312312311 NO1212121212121 DE1231234121231 <- should not be a match GB1231231231231 <- should not be a match¿Existe tal vez una manera de decirle a la expresión regular, si no coincide con "DE o GB", luego verifique con cualquier cosa, pero no con DE/GB?
En caso de que no se admita el uso de Javascript y una mirada retrospectiva negativa, también puede convertir la mirada retrospectiva en una anticipación y cambiar la última alternancia a una clase de carácter.
^(?:GB\d{2}[AZ]{4}\d{14}|DE\d{20})|(?!DE|GB)[AZ]{2}[AZ\d]{13,}$Mientras escribía la pregunta y preparaba los ejemplos, me topé con esta pregunta SO que tiene la solución: negative lookbehind
Adapté mi código para que se vea así: https://regex101.com/r/HqThjy/4
^(?:GB\d{2}[AZ]{4}\d{14}|DE\d{20})|[AZ]{2}(?<!DE|GB)(?:[AZ]|\d){13,}$ Este [AZ]{2}(?<!DE|GB) funciona. Busca 2 letras mayúsculas y solo continúa, si los 2 caracteres anteriores no son DE o GB . Más sobre Lookbehind aquí:regular-expressions.info