Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个数值范围正则表达式可以重构吗?_Javascript_Regex - Fatal编程技术网

Javascript 这个数值范围正则表达式可以重构吗?

Javascript 这个数值范围正则表达式可以重构吗?,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}|

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

-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中实现这一点,这必须是准确的

下面是分解这个东西的思维过程。我只是从最大数开始,一直往下算,然后通过在正则表达式中添加-来处理负数。很明显,你必须把这个东西复制粘贴到某个地方才能看到它。还有,可能是错误。让我的头几乎爆炸

  • 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}
        我不是性能测试专家。我确实想过把它分解成一系列的“如果”语句。你认为那样会更好吗?如果性能很小,我可能会选择把它放在一个大的正则表达式中,因为有很多其他原因不值得把我的问题弄得乱七八糟。性能差异可能很小(考虑到程序的其他部分会做什么)。为了便于阅读,我会避免使用大正则表达式。疯狂的想法是将字符串分解成已知的字符串,然后将单独的字符串与已知的数字范围(即数字-20x1 | | li1===x1&&li2>x2)t