【问题标题】:Regex to allow numbers only between 1 and 20000正则表达式只允许 1 到 20000 之间的数字
【发布时间】:2016-01-29 06:41:07
【问题描述】:

我是 javascript 新手,我正在使用正则表达式来验证值是否在 1 到 20000 之间 ^(?:[1-9]|(?:[1-9][0-9])|(?:[1-9][0-9][0-9])|(?:[1-9][0-9][0-9][0-9])|(?:[1-9][0-9][0-9][0-9][0-9])|(?:20000))$

这是我尝试过的表达式,但它允许 99999 有效

【问题讨论】:

  • 为什么不转换成数字,比较一下?
  • text<=20000 and text>=1 也应该可以工作。
  • 我需要正则表达式
  • 请给我们一个合理的理由,说明为什么应该使用 RegExp 来完成。你可能不会用勺子挖沟,虽然有可能......
  • 仅供参考:复杂的正则表达式也会导致性能问题。

标签: javascript regex


【解决方案1】:

虽然我怀疑这是最有效的解决方案,但这应该可以解决问题。

/^((1[0-9]{0,4})|([1-9][0-9]{0,3})|20000)$/

请注意,这是字符串匹配,而不是类型转换,因此不会匹配小数位和零填充等内容。

Regex Explained:

我使用的单元测试:

for (var i = 0; i < 100000; i++) {
	var should = i > 0 && i <= 20000;
	if (should !== /^((1[0-9]{0,4})|([1-9][0-9]{0,3})|20000)$/.test('' + i)) {
		console.log('FAILED:', i);
	}
}
console.log('DONE');

【讨论】:

  • 小数、千位分隔符、零填充、不知道分隔符本地化标准等在这里仍然会失败。
  • 这是真的,他们会的。
  • @AlexanderO'Mara:您的回答非常好。这些天下来投票者相当“慢”,他们忘记了这里的答案不仅适用于所有场合,而且可能专门针对每个 OP 问题量身定制。
【解决方案2】:

你可以用这个:

^1?\d{0,4}$

我认为您应该使用数字比较以获得更好的性能。 我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 2011-05-19
    相关资源
    最近更新 更多