正则表达式从10000到1800000

时间:2019-01-11 08:39:31

标签: regex mongodb optimization

我需要检查字符串是否是从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`);

3 个答案:

答案 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,数字过长,负数等。