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

jquery validator regex using array or variable

本文关键字:数组 变量 验证 正则表达式 jQuery      更新时间:2023-09-26

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

我想知道是否有办法将数组用于正则表达式的小数部分,如下所示......

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

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

然后在验证器中有类似的东西...

regex=/^4+decimal+/

这样的事情可能吗?

编辑:我用分数.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+'))?$')

这样的事情呢?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

您可以使用 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>
你可以

使用正则表达式构造函数,比如

//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 对每个数字调用一个函数,该函数将其转换为字符串并删除前导零。