Zobacz wyrażenie wyrażenia regularnego Przed warunkiem

0

Pytanie

Chciałem wyprowadzić następujący na podstawie wyrażeń regularnych. Chciałem mieć jakąś możliwość ponownego wykorzystania na podstawie formatów plików

Formaty plików

   export const datas = [
      {
        id: 1,
        name: "CODE_SLOT",
        codePosition: 0,
        codeType: "_",
        slotPosition: 1,
        slotType: "_",
      },
      {
        id: 2,
        name: "CODE-SLOT",
        codePosition: 0,
        codeType: "-",
        slotPosition: 1,
        slotType: "-",
      },
    ];

Kod do kodu produktu

export const getProductCode = (code, codePosition, codeType) => {
  return (
    code.replace(/\.[^/.]+$/, "").split(codeType)[codePosition] ||
    code.replace(/\.[^/.]+$/, "").split(codeType)[0] ||
    ""
  );
};



const images = [{
    name: "toys-blue_wide.jpg"
}]

const selectedFileNameFormat = datas[0]

const output = images.map((image) => ({
  productCode: getProductCode(
    image?.name,
    selectedFileNameFormat?.codePosition,
    selectedFileNameFormat?.codeType
  ),
}));

console.log(output)

Oczekiwany wynik dla kodu produktu

productCode: toys-blue

Kod do gniazda

export const getSlot = (slot, slotPosition, slotPosition) => {
  return (
    slot.replace(/\.[^/.]+$/, "").split(slotPosition)[slotPosition] ||
    slot.replace(/\.[^/.]+$/, "").split(slotPosition)[0] ||
    ""
  );
};
    const images = [{
    name: "toys-blue_wide.jpg"
}]
const selectedFileNameFormat = datas[0]

const output = images.map((image) => ({
  slotCode: getSlot(
    image?.name,
    selectedFileNameFormat?.codePosition,
    selectedFileNameFormat?.codeType
  ),
}));

Oczekiwany wynik dla gniazda

slotCode: wide
ecmascript-6 javascript regex
2021-11-23 03:41:23
1

Najlepsza odpowiedź

1

Jeśli dobrze rozumiem twoje pytanie, chcesz analizować/wyjąć z polecenia, Czyli "toy-blue_wide.jpg" a productCode wszystko, co było do "_" charakter, tj. "toy-blue"i a slotCodewszystko, co po "_" z wyłączeniem rozszerzenie pliku. Można użyć jedno wyrażenie regularne i połączyć te dwie części w odpowiednie grupy.

/^(.*)_(.*)\./

Pierwsze паренты odnotowują kod produktu, a drugi-kod gniazda. Za Pomocą RexExp.prototype.exec, można wyszukiwać według nazwy każdego pliku i usuwać tablicę zbiegów okoliczności.

const [, productCode, slotCode] = /^(.*)_(.*)\./.exec(name);

Należy również pamiętać, że podczas korzystania z przeznaczenia деструктуризации tablicy pomijamy pierwszy element. Jest to związane z tym, że pierwszy element, wracający z .exec czy pełny ciąg znaków, podczas gdy indeksy 1..n-to przechwycone grupy.

const images = [{
  name: "toys-blue_wide.jpg"
}];

const codeAndSlotRegex = /^(.*)_(.*)\./;

images.forEach(({ name }) => {
  const [, productCode, slotCode] = /^(.*)_(.*)\./.exec(name);
  console.log({ productCode, slotCode });
});

Zaktualizować

Aby umożliwić dynamiczny wybór analizatora nazw plików, ja bym wskazał konkretny program rozpoznawania nazw wyrażeń regularnych dla każdego formatu, który chcesz przeanalizować.

const fileNameFormats = [
  {
    id: 1,
    name: "Code-Slot",
    matcher: /^(.*)-(.*)\./
  },
  {
    id: 2,
    name: "Code_Slot",
    matcher: /^(.*)_(.*)\./
  }
];

Wykonaj iteracji na tablicy obrazów i użyj specjalnie wybrany program rozpoznawania nazw. Wprowadź wartość kopii tablicy w przypadku awarii mapowania, a także domyślny kod i wartości slotów.

const output = images.map((image) => {
  const [, productCode = "", contentSlot = ""] = selectedFileNameFormat.matcher.exec(
    image?.name
  ) ?? [];
  return {
    productCode,
    contentSlot
  };
});

Edit get-regex-expression-before-a-condition

2021-11-23 07:35:59

@Joseph Ja nie wiem, ten drugi post właściwie nic nie wyjaśnia, i wszystko, co sprawia, że codesandbox, to wybiera jedną z dwóch opcji i rejestruje lokalne warunki. Nie jestem pewien, co chcesz, aby zdaliśmy sobie sprawę z tego.
Drew Reese

@Joseph Dobrze, ale ja się pytam, co oznaczają opcje. Jeśli użytkownik wybierze "Kodowane gniazdo", co się wydarzy dalej, co oznacza, że wybór tej opcji? To samo, jeśli użytkownik wybierze "Code_Slot"? Myślałem, że chcesz wybrać format nazwy pliku do analizy. To jest dosłownie tak proste, jak po prostu podzielić symbol między "kodem" i "gniazdo"?
Drew Reese

@Józef, teraz rozumiem. Czy muszę zaktualizować odpowiedzi tutaj?
Drew Reese

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................