可以重构此数值范围正则表达式吗?

时间:2016-04-15 03:40:51

标签: 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}|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}

在负数与正数之间有一个不同的数字,所以你会看到我基本上复制了大部分内容。

所以有几个问题:

  1. 我做对了吗?
  2. 如果没有,那么更好的方法是什么?
  3. 考虑到数字的大小,这可以在没有正则表达式的情况下完成吗?我需要验证客户端。
  4. 可以重构并仍然保留严格的规则吗?
  5. 建议赞赏:)

2 个答案:

答案 0 :(得分:3)

  

考虑到数字的大小,这可以在没有正则表达式的情况下完成吗?

可以使用字符串操作(无需转换为数字)在一系列if语句中完成。

  • 所有不匹配[0-9] {1,19}的字符串都已用完

  • 所有长度为18或以下的候选人都很好

  • 对于长度为19,您可以使用字符串比较来查看它们是否在数值上小于您的上限

  • 调整以上内容以处理负数

答案 1 :(得分:0)

你的正则表达式是正确的。 这是一个较短的版本

^(?:-9223372036854775808|-?(?:\d{0,18}|(?!922337203685477580[8-9]|92233720368547758[1-9]|92233720368547759|922337203685477[6-9]|92233720368547[8-9]|9223372036854[8-9]|922337203685[5-9]|92233720368[6-9]|92233720369|922337203[7-9]|92233720[4-9]|9223372[1-9]|922337[3-9]|92233[8-9]|9223[4-9]|922[4-9]|92[3-9]|9[3-9])\d{19}))$

Regex demo

如何正确生成该正则表达式:
输入最大数量:

9223372036854775807

Output:

9223372036854775807
922337203685477580
92233720368547758
9223372036854775
922337203685477
92233720368547
9223372036854
922337203685
92233720368
9223372036
922337203
92233720
9223372
922337
92233
9223
922
92
9   

替换最后一个数字字母

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]

Output:

922337203685477580[8-9]
92233720368547758[1-9]
92233720368547759
922337203685477[6-9]
92233720368547[8-9]
9223372036854[8-9]
922337203685[5-9]
92233720368[6-9]
92233720369
922337203[7-9]
92233720[4-9]
9223372[1-9]
922337[3-9]
92233[8-9]
9223[4-9]
922[4-9]
92[3-9]
9[3-9]

Regex [Output]
922337203685477580[8-9]|92233720368547758[1-9]|92233720368547759|922337203685477[6-9]|92233720368547[8-9]|9223372036854[8-9]|922337203685[5-9]|92233720368[6-9]|92233720369|922337203[7-9]|92233720[4-9]|9223372[1-9]|922337[3-9]|92233[8-9]|9223[4-9]|922[4-9]|92[3-9]|9[3-9]

将这些[输出]添加到正则表达式

  

(?!的输出)\ d {19}

Will become [output2]

(?!922337203685477580[8-9]|92233720368547758[1-9]|92233720368547759|922337203685477[6-9]|92233720368547[8-9]|9223372036854[8-9]|922337203685[5-9]|92233720368[6-9]|92233720369|922337203[7-9]|92233720[4-9]|9223372[1-9]|922337[3-9]|92233[8-9]|9223[4-9]|922[4-9]|92[3-9]|9[3-9])\d{19}

匹配\d{19}< = 9223372036854775807

添加

  

^( - 9223372036854775808 | - (:???\ d {0,18} |的 [OUTPUT2] ))$

^(?:-9223372036854775808|-?(?:\d{0,18}|(?!922337203685477580[8-9]|92233720368547758[1-9]|92233720368547759|922337203685477[6-9]|92233720368547[8-9]|9223372036854[8-9]|922337203685[5-9]|92233720368[6-9]|92233720369|922337203[7-9]|92233720[4-9]|9223372[1-9]|922337[3-9]|92233[8-9]|9223[4-9]|922[4-9]|92[3-9]|9[3-9])\d{19}))$

将匹配

-9223372036854775808
+/- \d{0,18}
+/- \d{19}< = 9223372036854775807

Demo