Estoy tratando de averiguar Regex que solo aceptará las siguientes cadenas.
7 y 8 números: '1234567' y '12345678'
7 y 8 números que empiezan por T: 'T234567' y 'T2345678'
7 y 8 números que empiezan con D: 'D234567' y 'D2345678'
7 y 8 números que comienzan con TD: 'TD34567' y 'TD345678'
Regex que tengo es:
/^(T|[0-9]){1}(D|[0-9]){1}([0-9]){5,6}$/pero no está pasando mi prueba de unidad para 'D234567' y 'D2345678'
Podrías escribir el patrón como:
^(?:\d{7,8}|[TD]\d{6,7}|TD\d{5,6})$Explicación
^ Comienzo de cadena(?: Grupo de no captura para las alternativas\d{7,8} Combina 7-8 dígitos| O[TD]\d{6,7} Coincide con T o D y 6-7 dígitos| OTD\d{5,6} Partido TD y 5-6 dígitos) Cerrar el grupo de no captura$ Fin de la cadenaconst r = /^(?=.{7,8}$)T?D?\d+$/es la solución más sencilla. Aquí hay un desglose de lo que sucede:
import {lookAhead, maybe, sequence, suffix} from "compose-regexp" const r = sequence( // start anchor /^/, // are there exactly 7 or 8 characters before the end? lookAhead(suffix([7,8], /./), /$/), // optionally match a 'T' maybe('T'), // optionally match a 'D' maybe('D'), // match numbers until the end suffix('+', /\d/), /$/ )Puedes probarlo aquí
Con muchas pruebas.
De hecho, lo descubrí justo después de publicar esta pregunta. Simplemente agregue |D después de T| así como esto
/^(T|D|[0-9]){1}(D|[0-9]){1}([0-9]){5,6}$/