Obter a Expressão Regex Antes de uma Condição

0

Pergunta

Eu queria a saída a seguir, com base em expressões regex. Eu queria ter algum tipo de reutilização baseada em formatos de nome de arquivo

Formatos de nome de arquivo

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

Código do produto código

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)

Resultado esperado para o Produto de Código

productCode: toys-blue

Código de fenda

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

Resultado esperado para o slot

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

Melhor resposta

1

Se eu estou entendendo sua pergunta corretamente, você deseja analisar/extrair de uma seqüência de caracteres, por exemplo "toy-blue_wide.jpg", um productCode tudo antes de o "_" caráter, i.é. "toy-blue"e um slotCode, tudo após o "_" excluindo a extensão do arquivo. Você pode usar um único REGEX e capturar essas duas partes em seus respectivos grupos.

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

O primeiro parens captura o código do produto e a segunda captura o código de espaço. Usando RexExp.protótipo.exec você pode executar uma pesquisa sobre cada nome de arquivo e extraia uma matriz de jogos.

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

Repare também que quando usando a matriz desestruturação atribuição estamos ignorando o primeiro elemento. Isto é porque o primeiro elemento retornado de .exec é a completa cadeia de caracteres de correspondência, considerando que os índices de [1..n são os grupos capturados.

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

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

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

Atualização

Para permitir dinamicamente selecionando o nome do arquivo parser eu gostaria de especificar que um determinado REGEX matcher para cada formato que você deseja analisar.

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

Iterar sobre a matriz de imagens e usar os selecionados especificamente matcher. Fornecer uma alternativa matriz de valor no caso de que a correspondência de falha e código padrão e slot de valores.

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 sei lá, um outro post, realmente, não explica nada e todos os codesandbox não é escolher entre duas opções de log e o local do estado. Eu não tenho certeza do que você quer que a gente entender isso.
Drew Reese

@Joseph Ok, mas o que eu estou pedindo que a média opções. Se o usuário seleciona o "Código-Níqueis", o que é suposto acontecer, o que não selecionar essa opção significa? Mesmo porque, se o usuário seleciona o "Code_Slot"? Eu pensei que você estava querendo escolher um formato de nome de ficheiro para analisar. É, literalmente, basta dividir o símbolo entre o "code" e "slot"?
Drew Reese

@Joseph quero ver agora. Devo atualizar aqui a resposta, então?
Drew Reese

Em outros idiomas

Esta página está em outros idiomas

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