Javascript 这个数值范围正则表达式可以重构吗?
我需要匹配一个数字范围: -9223372036854775808至9223372036854775807Javascript 这个数值范围正则表达式可以重构吗?,javascript,regex,Javascript,Regex,我需要匹配一个数字范围: -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}|
^(?: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中实现这一点,这必须是准确的
下面是分解这个东西的思维过程。我只是从最大数开始,一直往下算,然后通过在正则表达式中添加-来处理负数。很明显,你必须把这个东西复制粘贴到某个地方才能看到它。还有,可能是错误。让我的头几乎爆炸
- 9223372036854775807
- 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}
if
语句中完成,只使用字符串操作(无需转换为数字)
- 所有与[0-9]{1,19}不匹配的字符串都将被删除
- 所有长度小于等于18的候选人都是优秀的
- 对于长度19,您可以使用字符串比较来查看它们在数值上是否小于上限
- 调整上述参数以处理负数
if
语句中完成,只使用字符串操作(无需转换为数字)
- 所有与[0-9]{1,19}不匹配的字符串都将被删除
- 所有长度小于等于18的候选人都是优秀的
- 对于长度19,您可以使用字符串比较来查看它们在数值上是否小于上限
- 调整上述参数以处理负数
- 您的正则表达式是正确的。
这是一个较短的版本
以下代码:::{0,18}}}40;以下:::::::{0,0,18}}40;以下::::!922337203678577580[8-9[8-8-9]124::::::::::::::::::::::::!922337203678785757575757577580[8-8-8-9[8-9[8-8-8-9]124;922337203333333372078787878787878787878787878787878787878787878787878787878787878787878787878787878785[8[8-8[8-9[8-8-9[8-8-9[8-8-9[8-8-8-8-9[8-8-8-9[8-9;;;92233147;92233[1-9]| 922337[3-9]124233[8-9]| 9223[4-9]| 922[4-9]| 92[3-9]| 9[3-9])\d{19}$
如何正确生成正则表达式:
输入最大数量:
9223372036854775807
替换最后一个数字字母
9->remove all line
8->9
7->[8-9]
6->[7-9]
5->[6-9]
4->[5-9]
3->[4-9]
2->[3-9]
1->[2-9]
0->[1-9]
(1-9)922337203678784775758[1-9]|; 922337207878787878787857577 | 92233720787878787878477[6-9)| 9223372036787878787878787878787878787878787878787878787878787878404040;;; 922337207878787878575757575757577 124;;;;; 922337878787878787878787878787878787878787878787878787 7 7 |;;;;;;;;92233787878787878575757575757575740404040404040404040404040404040404040404040407878787878787878787878787878787878787878787878787878787878787878124; 922[4-9]| 92[3-9]| 9[3-9] 将这些[output]添加到正则表达式 (?!输出)\d{19} (2-9)第922337207878575775758[1-9 9]124;922337207878787878577[1-9]| 922337207878787878577124;9223372078787857577[6-9]| 404040;以下代码::::::::::::;92233720337207878787878787878787878787878787878787878787878787878787878787878787878404040407[1-9[1-1-9)9)第二二介介介介介介介介介介介介介介介介介介介介介介介介介介介介介介介乎乎乎乎7 7;922337207878787878787878787878787878787878787878787878787840407[6[6[6-9[6-9)9]| 922[4-9]| 92[3-9]| 9[3-9])\d{19} 匹配
\d{19}
您的正则表达式是正确的。
这是一个较短的版本
以下代码:::{0,18}}}40;以下:::::::{0,0,18}}40;以下::::!922337203678577580[8-9[8-8-9]124::::::::::::::::::::::::!922337203678785757575757577580[8-8-8-9[8-9[8-8-8-9]124;922337203333333372078787878787878787878787878787878787878787878787878787878787878787878787878787878785[8[8-8[8-9[8-8-9[8-8-9[8-8-9[8-8-8-8-9[8-8-8-9[8-9;;;92233147;92233[1-9]| 922337[3-9]124233[8-9]| 9223[4-9]| 922[4-9]| 92[3-9]| 9[3-9])\d{19}$
如何正确生成正则表达式:输入最大数量:
9223372036854775807
替换最后一个数字字母
9->remove all line
8->9
7->[8-9]
6->[7-9]
5->[6-9]
4->[5-9]
3->[4-9]
2->[3-9]
1->[2-9]
0->[1-9]
(1-9)922337203678784775758[1-9]|; 922337207878787878787857577 | 92233720787878787878477[6-9)| 9223372036787878787878787878787878787878787878787878787878787878404040;;; 922337207878787878575757575757577 124;;;;; 922337878787878787878787878787878787878787878787878787 7 7 |;;;;;;;;92233787878787878575757575757575740404040404040404040404040404040404040404040407878787878787878787878787878787878787878787878787878787878787878124; 922[4-9]| 92[3-9]| 9[3-9] 将这些[output]添加到正则表达式 (?!输出)\d{19} (2-9)第922337207878575775758[1-9 9]124;922337207878787878577[1-9]| 922337207878787878577124;9223372078787857577[6-9]| 404040;以下代码::::::::::::;92233720337207878787878787878787878787878787878787878787878787878787878787878787878404040407[1-9[1-1-9)9)第二二介介介介介介介介介介介介介介介介介介介介介介介介介介介介介介介乎乎乎乎7 7;922337207878787878787878787878787878787878787878787878787840407[6[6[6-9[6-9)9]| 922[4-9]| 92[3-9]| 9[3-9])\d{19}
匹配
\d{19}
我不是性能测试专家。我确实想过把它分解成一系列的“如果”语句。你认为那样会更好吗?如果性能很小,我可能会选择把它放在一个大的正则表达式中,因为有很多其他原因不值得把我的问题弄得乱七八糟。性能差异可能很小(考虑到程序的其他部分会做什么)。为了便于阅读,我会避免使用大正则表达式。疯狂的想法是将字符串分解成已知的字符串,然后将单独的字符串与已知的数字范围(即数字-20