在条件之前获取正则表达式

Get Regex Expression Before a Condition

我想根据正则表达式输出以下内容。我想有某种基于文件名格式的可重用性

文件名格式

   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

如果我没有正确理解你的问题,你想 parse/extract 来自一个字符串,即“toy-blue_wide.jpg”,一个 productCode everything before "_" 字符,即 "toy-blue" 和一个 slotCode "_" 之后的所有内容,不包括文件扩展名.您可以使用单个 REGEX 并将这两个部分捕获到各自的组中。

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

第一个括号捕获产品代码,第二个捕获插槽代码。使用 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 });
});

更新

为了允许动态选择文件名解析器,我会为您要解析的每种格式指定一个特定的 REGEX 匹配器。

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