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
我正在使用带有正则表达式的 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