将函数输入限制为给定的正则表达式格式

时间:2018-04-19 20:44:29

标签: javascript node.js regex npm ecmascript-6

我有一个函数接受一个输入,一个数组,可以有X个值。我有一个字符串,表示所需的最终格式。

示例:

function doFormat(args) {
  const format = 'Foo \\d{1,2}x\\d{2} Bar';
}

doFormat([123, 2, 3]);

我们假设,目前format只包含与\\d匹配的正则表达式模式,并且输入只包含数字。

在此特定示例中,我想根据Foo 12x02 Bar变量的要求将输入args强制转换为字符串format,因为\\d{1,2}的第一个匹配将其限制为整数最大长度为2(因此修剪第一个输入,从12312),\\d{2}的第二个匹配限制为长度恰好为2的整数(因此填充第二个输入,从202)。我们删除3的第三个输入,因为它未在format中使用。

我怎样才能做到这一点?我在服务器上运行的Node脚本中使用它,所以如果需要,我可以使用任何NPM包。

1 个答案:

答案 0 :(得分:1)

我创建了名为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可以创建自定义字符串格式化程序(以及您想要的任何内容)。提供的包用它来产生新的功能。它要求占位符是一个可以将值转换为字符串的函数。