javascript - 这个数字范围正则表达式可以重构吗?

标签 javascript regex

我需要匹配一个数字范围:

-92233720368547758089223372036854775807

^(?: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. 可以重构并仍然保留严格的规则吗?

感谢建议:)

最佳答案

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/

相关文章:

regex - str.startswith 使用正则表达式

java - 如何使用正则表达式解析键值

javascript - 单击一个 Accordion 时,多个 Bootstrap Accordion 会折叠其他 Accordion

javascript - 在 ES6 中使用 Koa.js

javascript - ng-if 不与 ng-src 一起使用

javascript - 如何将两个字符串匹配到一个路由 express.js

regex - 正则表达式 : first match vs greedy match

javascript - 带有两个计数器的 For 循环,以及令人困惑的 if-else 语句。(JavaScript)

javascript - React Context API状态更新导致无限循环

java - 正则表达式不拆分 [ 如果字符串位于 ""之下