jquery 使用数组或变量的验证器正则表达式

jquery validator regex using array or variable

我正在使用带有正则表达式的 jquery 验证器插件来测试只接受数字和小数的匹配输入字段,例如:1.0 到 1.984375(1/64 增量)它可以工作,但正则表达式很长而且我需要多次重复使用它,但对小数点前的数字稍作改动。

我想知道是否有一种方法可以将数组用于正则表达式的小数部分,就像这样...

var decimals = (\.015625|\.03125|\.046875...)?$

var decimals = (\.015625, \.03125, \.046875...)

然后在验证器中有类似...

regex=/^4+decimal+/

这样的事情可能吗?

编辑:我用 fraction.js 在 plalx 代码中添加了分数,可以在这里找到... http://hypervolu.me/~erik/fraction.js/.

var fractionsAll=range(1/64, 63/64, 1/64).map(convertToFraction).join('|');

function convertToFraction(num){
    return new Fraction(num)
};

示例:1-10

regexp: new RegExp('^([1-9]|10$)(\.('+decimalsAll+')|\s('+fractionsAll+'))?$')

您可以使用 jQuery.inArray()

或类似的功能

<script>

var LOW_VALUE = 0.00001;

function check(number) {
    if (number < 1 || number > 1.99) return false
    return (Math.abs(number % (1/64)) < LOW_VALUE);
}

console.log(check(0.15625));
console.log(check(1.984375));
console.log(check(0.6));

</script>

您可以使用 RegExp 构造函数,例如

//need to store the values as strings not as numerical values because otherwise the `0` prefix will come when it is converted to a string, also need to escape the `.` with 2 `\`
var decimals = ['\.015625', '\.03125', '\.046875'].join('|');

var regex= new RegExp('^4(' + decimals + ')$');

您可以使用 new RegExp 从字符串构造正则表达式,并使用 join 从数组构造字符串。

var decimals = ['.015625', '.03125', '.046875', ...];
var regex = new RegExp('^4(' + decimals.join('|').replace(/\./g, '\.') + ')$');

decimals的元素需要是字符串。如果它们是数字,如果数字是分数,那么将它们转换为字符串将添加前导 0 ,这会弄乱正则表达式。如果您不想这样做,可以使用 Array.prototype.map 对每个数字调用一个函数,将其转换为字符串并删除前导零。

像这样的事情怎么样? RegExp 构造函数允许从字符串构造动态正则表达式。

var decimals = range(.015625, 0.984375, 1/64).map(removeDotAndBefore).join('|');

var regex = new RegExp('^4(\.(' + decimals + '))?$');


function range(from, to, increment) {
    var values = [];

    for (; from <= to; from += increment) values.push(from);

    return values;
}

function removeDotAndBefore(num) {
    return num.toString().replace(/^\d+\./, '');
}

请注意,您应该能够使用取模运算符来判断一个数是否可​​以被 1/64 整除。

function isOne64Increment(num) { return !(num % (1/64)); }

range(.015625, 0.984375, 1/64).every(isOne64Increment); //true