Regex只匹配JS中的长整数



我需要创建一个正则表达式来验证长整型输入,并确保它们是大整型正值。这意味着有效范围应在09223372036854775807之间

有一种方法可以创建正则表达式,而无需手动添加范围内的所有有效数字(即d{0,18} | [1-8]d{0,18} | 9[0-1]d{0,17} | 92[0-1]d{0,16} ...(?

正如我在评论中所说,您所拥有的是(接近(只使用regex的最佳方法。这通常不仅仅由regex处理。以下是最简单的方法:

function validateLongInt(str) {
return str.match(/^d+$/) && BigInt(str) <= 9223372036854775807n;
}
console.log(validateLongInt("0"))  // truthy
console.log(validateLongInt("1"))  // truthy
console.log(validateLongInt("9223372036854775807"))  // truthy
console.log(validateLongInt("-1")) // falsy
console.log(validateLongInt("9223372036854775808"))  // falsy
console.log(validateLongInt("A"))  // falsy
console.log(validateLongInt(""))   // falsy

请注意,您不能与常规JavaScript数字进行比较(或者至少,不是天真地(,因为您对安全整数范围之外的数字感兴趣:

const max = 9223372036854775807;
console.log(max + 1 > max); // false?!?

不是一个纯regex解决方案,但除了验证it"外观;就像它在regex的范围内一样,您可以迭代字符串的每个索引,并将其值与目标字符串进行比较。

const MAX_VALUE = "9223372036854775807";
const lengthCheck = new RegExp(`^\d{1,${MAX_VALUE.length}}$`);
function validateLongPositiveInteger(value) {
if (!lengthCheck.test(value)) {
return false;
}
if (value.length < MAX_VALUE.length) {
return true;
}
for (let i = 0; i < MAX_VALUE.length; i++) {
if (value[i] > MAX_VALUE[i]) {
return false;
}
if (value[i] < MAX_VALUE[i]) {
return true;
}
}
return true;
}

如果reg exp不是硬性要求,那么还有另一种方法可以进行验证:

const isValidPositiveLongNumber = (input: string | number | undefined, maxValue = 9223372036854775807): boolean => {
if (input === undefined || input === null) {
return false;  
}
const parsed = parseInt(input);
if (isNaN(parsed)) {
return false;
}
return parsed >= 0 && parsed <= maxValue;
}
console.log(isValidPositiveLongNumber("-6789"));
console.log(isValidPositiveLongNumber("12423554"));

最新更新