我需要检查字符串是否是从10000到1800000的数字。
我附带了以下正则表达式:
^[1-9][0-9]{4}$|^[0-9]{6}$|^1[0-7][0-9]{5}$|^1800000$+
是否有更好或更优化的执行方式?
const regex = /^[1-9][0-9]{4}$|^[0-9]{6}$|^1[0-7][0-9]{5}$|^1800000$/;
const mustFailTests = [
'9999',
'15',
'00015',
'-15000',
'1800001',
'9000000',
'0',
'',
];
const mustWorkTests = [
'10000',
'1800000',
'200000',
'25018',
'778410',
'1000000',
'1205900',
];
const start = Date.now();
mustFailTests.forEach((x) => {
const ret = regex.test(x);
console.log(`${x} must fail : result ${ret}`);
});
console.log('--------------------------------');
mustWorkTests.forEach((x) => {
const ret = regex.test(x);
console.log(`${x} must succeed : result ${ret}`);
});
for (let i = 0; i < 500000; i += 1) {
mustWorkTests.forEach(x => regex.test(x));
mustFailTests.forEach(x => regex.test(x));
}
console.log(`It took ${Date.now() - start} ms`);
答案 0 :(得分:5)
为什么不将字符串转换为数字并与所需的字符串进行比较
const validate = (input) => 10000 <= +input && 1800000 >= +input
答案 1 :(得分:3)
更简洁的模式可能是让一个可选的前导组包含17个或更少的数字,或者任何一位数字,然后在该组后面再加上5位数字。替换为1800000。
:user_id
答案 2 :(得分:2)
我同意转换为数字可能会更好,但是如果您需要使用正则表达式:
您当前正则表达式的中间术语不正确-当前将匹配000001。您可以通过将其更改为
来进行改进^ [1-9] [0-9] {4, 5 } $ | ^ 1 [0-7] [0-9] {5} $ | ^ 1800000 $ >
通常,您应该具有测试意外输入和预期输入的测试用例-前导0,数字过长,负数等。