我有一个类似的字符串
const string =
"DEVICE_SIZE IN ('036','048','060','070') AND DEVICE_VOLTAGE IN ('1','3') AND NOT DEVICE_DISCHARGE_AIR IN ('S') AND NOT DEVICE_REFRIGERANT_CIRCUIT IN ('H','C')";
由此,我需要映射相应的密钥和值,如DEVICE_SIZE: ["036", "048", "060", "070"]
当前结果:
const string =
"DEVICE_SIZE IN ('036','048','060','070') AND DEVICE_VOLTAGE IN ('1','3') AND NOT DEVICE_DISCHARGE_AIR IN ('S') AND NOT DEVICE_REFRIGERANT_CIRCUIT IN ('H','C')";
const res = string.split('IN ');
const regExp = /(([^)]+))/;
const Y = 'AND';
const data = res.map((item) => {
if (regExp.exec(item)) {
return {
[item.slice(item.indexOf(Y) + Y.length)]: regExp.exec(item)[1],
};
}
});
console.log('data ', data);
预期结果:
[
{ "DEVICE_SIZE": ["036", "048", "060", "070"] },
{ "DEVICE_VOLTAGE": ["1", "3"] },
{ "NOT DEVICE_DISCHARGE_AIR": ["s"] },
{ "NOT DEVICE_REFRIGERANT_CIRCUIT": ["H", "C"] },
];
根据我对当前结果的尝试,我无法得到确切的结果。你能帮助我达到上述预期结果吗?
注意:我正在尝试以上操作,以实现我在上一个问题中提到的最终结果如何从与相应数组匹配的字符串中获取有效对象?
您可以使用一个带有两个捕获组的正则表达式来匹配键和值。
((?:bNOTs+)?w+)s+INs+('([^()]*)')
请参阅regex演示。
模式匹配:
(
捕获组1(?:bNOTs+)?
(可选)匹配单词NOT后面跟1个以上空白字符w+
匹配一个或多个单词字符
)
关闭组s+INs+
在空白字符之间匹配单词IN('
匹配('
([^()]*)
捕获组2,匹配除(
和)
之外的任何字符的1+次')
匹配')
要为对象创建动态键,可以使用object Initializer,并且可以在','
上进行拆分,为值创建结果数组。
const regex = /((?:bNOTs+)?w+)s+INs+('([^()]*)')/g;
const string = "DEVICE_SIZE IN ('036','048','060','070') AND DEVICE_VOLTAGE IN ('1','3') AND NOT DEVICE_DISCHARGE_AIR IN ('S') AND NOT DEVICE_REFRIGERANT_CIRCUIT IN ('H','C')";
const data = Array.from(
string.matchAll(regex), m =>
({
[m[1]]: m[2].split("','")
})
);
console.log(data);
您可以先用AND
进行拆分,然后用IN
再次进行拆分,以分离键和值部分。
这也会起作用:
const string =
"DEVICE_SIZE IN ('036','048','060','070') AND DEVICE_VOLTAGE IN ('1','3') AND NOT DEVICE_DISCHARGE_AIR IN ('S') AND NOT DEVICE_REFRIGERANT_CIRCUIT IN ('H','C')";
const output = string
.split("AND")
.map((item) => item.split("IN").map((text) => text.trim()))
.map(([key, value]) => ({
[key]: value.replace(/[()']/g, "").split(","),
}));
console.log(output);
您可以使用Object.fromEntries
,它将键值元组[string, any]
转换为具有这些元组的对象:
const data = Object.fromEntries(res.map((item) => {
if (regExp.exec(item)) {
return [item.slice(item.indexOf(Y) + Y.length).trim(), regExp.exec(item)[1].split(',').map(value => value.slice(1, -1))];
}
return undefined;
}).filter(Boolean));
然后从那里继续。