我正在使用带有正则表达式的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+'))?$')
答案 0 :(得分:1)
您可以使用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>
答案 1 :(得分:1)
您可以使用像
这样的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 + ')$');
答案 2 :(得分:1)
您可以使用new RegExp
从字符串构造正则表达式,并使用join
从数组构造字符串。
var decimals = ['.015625', '.03125', '.046875', ...];
var regex = new RegExp('^4(' + decimals.join('|').replace(/\./g, '\\.') + ')$');
decimals
的元素必须是字符串。如果它们是数字,那么将它们转换为字符串将添加一个前导0
如果数字是一个分数,这将搞乱正则表达式。如果您不想这样做,可以使用Array.prototype.map
在每个数字上调用一个函数,将其转换为字符串并删除前导零。
答案 3 :(得分:1)
这样的事情怎么样? 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