Ja osobiście wolałbym rozbić cały proces na kilka etapów, żeby ominąć tego skomplikowanego regexa i zrobiłbym mniej więcej coś takiego
const transformToSpecificFormat = (text) => {
if (text.length !== 13) {
return false;
}
const [_, startChunk, centerChunk, endChunk] = text.match(/^(\d{4})(\d{8})(\d)$/);
if (!centerChunk.startsWith(startChunk)) {
return false;
}
return `${startChunk}/${centerChunk}/${endChunk}`;
}
console.log(transformToSpecificFormat("1234123456789")); // Wynik -> "1234/12345678/9"
Funkcja w przypadku błędu, gdy nie udało jej się zamienić tekstu na specjalny format zwraca false
.
Gdy potrzebujemy specjalnej informacji, że coś się zepsuło to możemy zamienić to na zwracanie wyjątków i załapanie tego w try / catch
.
class SpecificFormatLengthError extends Error {}
class SpecificFormatGroupEqualsError extends Error {}
const transformToSpecificFormat = (text) => {
if (text.length !== 13) {
throw new SpecificFormatLengthError('Tekst ma nieprawidłową długość');
}
const [_, startChunk, centerChunk, endChunk] = text.match(/^(\d{4})(\d{8})(\d)$/);
if (!centerChunk.startsWith(startChunk)) {
throw new SpecificFormatGroupEqualsError('Tekst ma nieprawidłowy format');
}
return `${startChunk}/${centerChunk}/${endChunk}`;
}
try {
console.log(transformToSpecificFormat("1234023456789"))
} catch (error) {
// Ogólna obsługa błędu
console.dir(error);
// Specyficzna obsługa błędu pod konkretny typ
if (error instanceof SpecificFormatLengthError) {
// ...
} else if (error instanceof SpecificFormatGroupEqualsError) {
// ...
}
}