Dostat Regex Výraz, Než Podmínkou

0

Otázka

Chtěl jsem, aby výstup následující na základě regex výrazy. Chtěl jsem mít nějaký druh opětné použitelnosti na základě názvem formátů

Názvem formátů

   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: "-",
      },
    ];

Kód pro kód 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)

Očekávaný Výstup pro Kód Produktu

productCode: toys-blue

Kód pro slot

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
  ),
}));

Očekávaný Výstup slot pro

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

Nejlepší odpověď

1

Pokud chápu váš dotaz správně, chcete analyzovat/extrakt z řetězce, tj. "toy-blue_wide.jpg" productCode všechno před tím "_" charakter, tj. "toy-blue"a slotCodevšechno po"_" kromě příponou souboru. Můžete používat jeden regulární výraz a zachytit tyto dvě části v jejich příslušných skupinách.

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

První závorkou zachycuje kód výrobku a druhá zachycuje výherní kód. Pomocí RexExp.prototyp.exec můžete provést vyhledávání nad každé jméno souboru a extrahovat řadu zápasů.

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

Všimněte si také, že při použití pole destructuring úkol vynecháme první prvek. Je to proto, že první prvek se vrátil z .exec je plná řetězec znaků, uzavřeno, vzhledem k tomu, že indexy 1..n jsou zachycené skupiny.

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

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

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

Aktualizace

Umožnit dynamicky výběru názvem parser bych určit konkrétní REGEX dohazovač pro každý formát, který chcete analyzovat.

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

Iterovat přes pole obrázků a použití speciálně vybraných dohazovač. Poskytovat záložní pole hodnota v případě, že se párování nezdaří, a výchozí kód a slot hodnoty.

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 nevím, že další post nemá opravdu nic vysvětlovat a všechny codesandbox dělá, je vybrat ze dvou možností a log místní státu. Nejsem si jistý, co chcete, abychom pochopili, od ní.
Drew Reese

@Joseph Ok, ale ptám se, co volby znamenají. Pokud uživatel zvolí "Kód-Slot", co se mělo dít dál, co má tuto možnost výběru myslíte? Stejné pro pokud uživatel vybere "Code_Slot"? Myslel jsem, že jsi chtěl vybrat formát názvu souboru k analýze. Je to doslova tak jednoduché, jak jen rozdělení na symbol mezi "kód" a "slot"?
Drew Reese

@Joseph teď vidím. Mám aktualizovat odpověď tady?
Drew Reese

V jiných jazycích

Tato stránka je v jiných jazycích

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