Получить выражение регулярного выражения Перед условием

0

Вопрос

Я хотел вывести следующее на основе выражений регулярных выражений. Я хотел иметь какую-то возможность повторного использования на основе форматов файлов

Форматы файлов

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

Код для кода продукта

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)

Ожидаемый результат для кода продукта

productCode: toys-blue

Код для слота

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

Ожидаемый результат для слота

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

Лучший ответ

1

Если я правильно понимаю ваш вопрос, вы хотите проанализировать/извлечь из строки, т. Е. "toy-blue_wide.jpg", а productCode все, что было до "_" характер, т. е. "toy-blue", и а slotCode, все, что после "_" исключая расширение файла. Вы можете использовать одно регулярное выражение и объединить эти две части в соответствующие группы.

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

Первые паренты фиксируют код продукта, а вторые-код слота. Используя RexExp.prototype.exec, вы можете выполнить поиск по каждому имени файла и извлечь массив совпадений.

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

Обратите также внимание, что при использовании назначения деструктуризации массива мы пропускаем первый элемент. Это связано с тем, что первый элемент, возвращенный из .exec соответствует ли полная строка символов, тогда как индексы 1..n-это захваченные группы.

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

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

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

Обновить

Чтобы разрешить динамический выбор анализатора имен файлов, я бы указал конкретный сопоставитель регулярных выражений для каждого формата, который вы хотите проанализировать.

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

Выполните итерацию по массиву изображений и используйте специально выбранный сопоставитель. Укажите значение резервного массива в случае сбоя сопоставления, а также код по умолчанию и значения слотов.

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 Я не знаю, этот другой пост на самом деле ничего не объясняет, и все, что делает codesandbox, - это выбирает один из двух вариантов и регистрирует локальное состояние. Я не уверен, что вы хотите, чтобы мы поняли из этого.
Drew Reese

@Джозеф Хорошо, но я спрашиваю, что означают варианты. Если пользователь выбирает "Кодовый слот", что должно произойти дальше, что означает выбор этой опции? То же самое, если пользователь выберет "Code_Slot"? Я думал, вы хотели выбрать формат имени файла для анализа. Это буквально так же просто, как просто разделить символ между "кодом" и "слотом"?
Drew Reese

@Джозеф, теперь я понимаю. Должен ли я обновить ответ здесь?
Drew Reese

На других языках

Эта страница на других языках

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