我有一个函数接受一个输入,一个数组,可以有 X 个值。我有一个字符串,表示所需的最终格式。
例子:
function doFormat(args) {
const format = 'Foo \\d{1,2}x\\d{2} Bar';
}
doFormat([123, 2, 3]);
现在,我们假设 format
将只包含一个匹配数字与 \\d
的正则表达式模式,并且输入将只包含数字。
在这个具体示例中,我想将输入参数强制转换为字符串 Foo 12x02 Bar
,这是 format
变量所要求的,因为 的第一个匹配项>\\d{1,2}
将其限制为最大长度为 2 的整数(因此将第一个输入从 123
trim 为 12
),并且 \\d{2}
的第二个匹配项限制为长度恰好为 2 的整数(因此填充第二个输入,从 2
到 02
)。我们删除 3
的第三个输入,因为它没有在 format
中使用。
我怎样才能做到这一点?我在服务器上运行的 Node 脚本中使用它,因此如果需要,我可以使用任何 NPM 包。
最佳答案
我创建了名为 to-fmt
的 npm 包,它使用文字模板来生成新的字符串渲染器函数。
对于您的情况,它可以像这样工作:
import f from 'to-fmt';
// Number formatter function
const num = (...args) => value => {
let start;
let end;
const str = String(value);
if (args.length > 1) {
start = args[0];
end = start + args[1];
}
else if (args.length) {
start = 1;
end = 1 + args[0];
}
else {
start = 1;
end = str.length;
}
const len = end - start;
return str.slice(start - 1, end - 1)
.padStart(len, '0')
.slice(-len);
};
// Create new format:
const format = f`Foo ${num(1, 2)}x${num(2)} Bar`;
format(123, 2, 3); // -> 'Foo 12x02 Bar'
// And if you want to pass an Array
format(...[123, 2, 3]); // -> 'Foo 12x02 Bar'
使用 template literal可以创建自定义字符串格式化程序(以及任何你想要的)。提供的包使用它来产生新功能。它要求占位符是一个可以将值转换为字符串的函数。
关于javascript - 将函数输入限制为给定的正则表达式格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929943/