在条件之前获取正则表达式
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
};
});
我想根据正则表达式输出以下内容。我想有某种基于文件名格式的可重用性
文件名格式
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
};
});