Così si hanno attualmente: ^\d{3}-?\d{2}-?\d{4}$
Quello che vi serve è quello di consentire una delle quei blocchi numerici devono essere "X" invece. Questo è anche abbastanza semplice come una regex - basta adattare il vostro uno esistente per avere X
invece di \d
in ognuno dei tre luoghi essa è presente X{3}-?X{2}-?X{4}
Lei non vuole essere la combinazione di un codice numerico con il codice e X, quindi basta per consentire sia un caso o nell'altro, quindi avvolgerli tra parentesi e ci ha un carattere pipe di specificare uno o l'altro, in questo modo:
^((\d{3}-?\d{2}-?\d{4})|(X{3}-?X{2}-?X{4}))$
probabilmente anche desidera consentire superiore - o minuscolo X. Questo può essere specificato usando [Xx]
o rendendo l'intero caso non sensibile, usando il modificatore i
all'esterno della regex.
soluzione con test di unità https://regex101.com/r/rP8wL0/1 –