Регулярное выражение от 10000 до 1800000 - PullRequest
0 голосов
/ 11 января 2019

Мне нужно проверить, является ли строка числом от 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 голосов
/ 11 января 2019

Я согласен, что преобразование в число, вероятно, будет лучше, но если вам нужно использовать регулярное выражение:

Средний термин вашего текущего регулярного выражения неправильный - в настоящее время он соответствует 000001. Вы можете улучшить его, изменив его на

^ [1-9] [0-9] {4 5 } $ | ^ 1 [0-7] [0-9] {5} $ | ^ 1800000 $

В общем, у вас должны быть тестовые случаи, которые проверяют неожиданные входные данные, а также ожидаемые входные данные - ведущие 0, слишком длинные числа, отрицательные значения и т. Д.

0 голосов
/ 11 января 2019

Более чистым шаблоном может быть наличие необязательной ведущей группы, содержащей 17 или ниже, или любой одной цифры, затем следуйте за этой группой еще на 5 цифр. Альтернатива с 1800000.

const regex = /^(?:(?:1[0-7]|[0-9])?[0-9]{5}|1800000)$/;

const mustFailTests = [
  '9999',
  '15',
  '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 голосов
/ 11 января 2019

почему вы не конвертируете эту строку в число и сравниваете с теми, что вам нужны, вот так

const validate = (input) => 10000 <= +input && 1800000 >= +input
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...