我需要匹配一个数字范围:
-9223372036854775808到9223372036854775807
^(?:922337203685477580[0-7]|9223372036854775[0-7]\d{2}|922337203685477[0-4]\d{3}|92233720368547[0-6]\d{4}|9223372036854[0-6]\d{5}|922337203685[0-3]\d{6}|92233720368[0-4]\d{7}|9223372036[0-7]\d{8}|922337203[0-5]\d{9}|92233720[0-2]\d{10}|922337[0-1]\d{12}|92233[0-6]\d{13}|9223[0-2]\d{14}|922[0-2]\d{15}|92[0-1]\d{16}|9[01]\d{17}|[1-8]\d{18}|\d{0,18}|-(?:922337203685477580[0-8]|9223372036854775[0-7]\d{2}|922337203685477[0-4]\d{3}|92233720368547[0-6]\d{4}|9223372036854[0-6]\d{5}|922337203685[0-3]\d{6}|92233720368[0-4]\d{7}|9223372036[0-7]\d{8}|922337203[0-5]\d{9}|92233720[0-2]\d{10}|922337[0-1]\d{12}|92233[0-6]\d{13}|9223[0-2]\d{14}|922[0-2]\d{15}|92[0-1]\d{16}|9[01]\d{17}|[1-8]\d{18}|\d{0,18}))?$
// space for easier copy and paste
是的,我知道这听起来很疯狂,但这背后有一个很长的故事。由于数字的大小,我无法通过仅检查范围来弄清楚如何在 JavaScript 中执行此操作,而且这必须准确。
这是分解这个东西的思维过程。我只是从最大数字开始,然后一直向下,然后通过在正则表达式中添加 - 来处理负数。显然,您必须将其复制并粘贴到某个地方才能看到全部内容。另外,也可能有错误。让我的头几乎爆炸。
- 9,223,372,036,854,775,807
- 922337203685477580[0-7]
- 9223372036854775[0-7][0-9]{2}
- 922337203685477[0-4][0-9]{3}
- 92233720368547[0-6][0-9]{4}
- 9223372036854[0-6][0-9]{5}
- 922337203685[0-3][0-9]{6}
- 92233720368[0-4][0-9]{7}
- 9223372036[0-7][0-9]{8}
- 922337203[0-5][0-9]{9}
- 92233720[0-2][0-9]{10}
- 922337[0-1][0-9]{12}
- 92233[0-6][0-9]{13}
- 9223[0-2][0-9]{14}
- 922[0-2][0-9]{15}
- 92[0-1][0-9]{16}
- 9[01][0-9]{17}
- [1-8][0-9]{18}
- [0-9]{0,18}
负数和正数有一个数字不同,所以你会看到我必须基本上复制其中的大部分内容。
有几个问题:
- 我这样做对吗?
- 如果没有,有什么更好的方法?
- 考虑到数字的大小,可以在不使用正则表达式的情况下完成此操作吗?我需要验证客户端。
- 可以重构并仍然保留严格的规则吗?
感谢建议:)
最佳答案
Can this be done without regular expressions considering the size of the number?
它可以通过一系列 if
语句仅使用字符串操作来完成(无需转换为数字)。
所有不匹配 [0-9]{1,19} 的字符串均已排除
所有长度为 18 或以下的候选者都很好
对于长度 19,您可以使用字符串比较来查看它们的数值是否小于您的上限
调整上述内容以处理负数
关于javascript - 这个数字范围正则表达式可以重构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36637850/