Tworzenie formatu

0

Jak mogę stworzyć 13-znakowy twór w formacie ABCD/ABCDEFGH/A? W formacie 3/3/3 nie mam problemu:

s.substring(s.length-13, s.length).replace(/\B(?:\d{3}){1,3}(?!\d))/g, "/")

Ale moje inne kombinacje typu (?:\d{4})(?:\d{8})(?:\d{1}) powodują tylko kontrole liczby znaków, a nie sam format z /.

0

Możesz wrzucić przykładowe dane wejściowe, oraz dane wyjściowe tej metody replace, które chciałbyś uzyskać tym regexem?

Aktualnie nie za bardzo rozumiem jakby miała działać ta zamiana.

PS:
Obecnie ten regex nawet nam nie zadziała /\B(?:\d{3}){1,3}(?!\d))/g bo na samym końcu znajduje się niepotrzebny nawias ) :)

2

A zamiast

s.substring(s.length-13, s.length).replace(/\B(?:\d{3}){1,3}(?!\d))/g, "/")

nie możesz zrobić

.replace(/(?:\d{4})(?:\d{8})(?:\d)$/, "/")

Dodałem $, żeby wzorzec był zlapany tylko na końcu, bo rozumiem że po to właśnie masz ten .substring()?

Tak na prawdę musisz opisać co dokładnie ten kod ma robić, bo z tego co napisałeś nie da się wywnioskować co chcesz.

0
Xarviel napisał(a):

Możesz wrzucić przykładowe dane wejściowe, oraz dane wyjściowe tej metody replace, które chciałbyś uzyskać tym regexem?

Aktualnie nie za bardzo rozumiem jakby miała działać ta zamiana.

PS:
Obecnie ten regex nawet nam nie zadziała /\B(?:\d{3}){1,3}(?!\d))/g bo na samym końcu znajduje się niepotrzebny nawias ) :)

Zmiana miała by działać, że np. użytkownik podaje 13 znaków np. ABCDEFGHIJKLM i automatycznie zostanie wszystko rozdzielone na format 4/8/1 czyli ABCD/EFGHIJKL/M. Ten kod co podaje wcześniej rozdziela po trzech znakach, a jak próbuję stworzyć w innym formacie (moja próba opisana na samym końcu), to nie zostają wstawiane ukośniki.

Tak mam, aby dzieliło po 3:

var s = textToFormat.replace(/[^d]/g,””);
return s.substring(s.length-13, s.length).replace(/\B(?:\d{3}){1,3}(?!\d))/g, "/");
1
Riddle napisał(a):

A zamiast
rgv

s.substring(s.length-13, s.length).replace(/\B(?:\d{3}){1,3}(?!\d))/g, "/")

nie możesz zrobić

.replace(/(?:\d{4})(?:\d{8})(?:\d)$/, "/")

Dodałem $, żeby wzorzec był zlapany tylko na końcu, bo rozumiem że po to właśnie masz ten .substring()?

Tak na prawdę musisz opisać co dokładnie ten kod ma robić, bo z tego co napisałeś nie da się wywnioskować co chcesz.

Zmiana miała by działać, że na starcie mamy np. 13 znaków np. ABCDEFGHIJKLM i automatycznie zostanie wszystko rozdzielone na format 4/8/1 czyli ABCD/EFGHIJKL/M. Ten kod co podaje wcześniej rozdziela po trzech znakach, a jak próbuję stworzyć w innym formacie (moja próba opisana na samym końcu), to nie zostają wstawiane ukośniki, jedynie pilnowane jest, aby było te 13 znakow.

var s = textToFormat.replace(/[^d]/g,””);
return s.substring(s.length-13, s.length).replace(/\B(?:\d{3}){1,3}(?!\d))/g, "/");

To co zostało podane niestety nie działa.

0

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) {
    // ...
  }
}
0
hopeless napisał(a):

Zmiana miała by działać, że np. użytkownik podaje 13 znaków np. ABCDEFGHIJKLM i automatycznie zostanie wszystko rozdzielone na format 4/8/1 czyli ABCD/EFGHIJKL/M. Ten kod co podaje wcześniej rozdziela po trzech znakach, a jak próbuję stworzyć w innym formacie (moja próba opisana na samym końcu), to nie zostają wstawiane ukośniki.

No to nie mogłeś tak od razu napisać?

function format(text) {
  if (text.length === 13) {
    return text.substr(0, 4) + "/" + text.substr(4, 10) + "/" + text[12];
  }
  return text;
}
format("ABCDEFGHIJKLM");

1 użytkowników online, w tym zalogowanych: 0, gości: 1