Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
Regex 我使用正则表达式将数字限制在3.00到100.00之间,但它允许数字在100.01到100.99之间_Regex - Fatal编程技术网

Regex 我使用正则表达式将数字限制在3.00到100.00之间,但它允许数字在100.01到100.99之间

Regex 我使用正则表达式将数字限制在3.00到100.00之间,但它允许数字在100.01到100.99之间,regex,Regex,我有一个要求,将数字限制在3.00到100.00之间 我用下面的表达 ^([3-9]|[1-9][0-9]|100)+(\.\d{1,2})?$ ^([3-9]|[1-9][0-9]|100.00)+(\.\d{1,2})?$ 上面表达式的问题是,它允许100.01到100.99,这应该限制。它还允许310到399,这需要限制 我用了另一种同样的表达方式 ^([3-9]|[1-9][0-9]|100)+(\.\d{1,2})?$ ^([3-9]|[1-9][0-9]|100.00)+(\.

我有一个要求,将数字限制在3.00到100.00之间 我用下面的表达

^([3-9]|[1-9][0-9]|100)+(\.\d{1,2})?$
^([3-9]|[1-9][0-9]|100.00)+(\.\d{1,2})?$
上面表达式的问题是,它允许100.01到100.99,这应该限制。它还允许310到399,这需要限制

我用了另一种同样的表达方式

^([3-9]|[1-9][0-9]|100)+(\.\d{1,2})?$
^([3-9]|[1-9][0-9]|100.00)+(\.\d{1,2})?$
它按预期工作,但我们需要在中输入100.00来传递正则表达式,而不是100


有什么方法可以达到预期的结果吗?

这个问题:
^([3-9]|[1-9][0-9]|100)+(\.\d{1,2})$
,它还允许第一个块中的100(负责允许整数的块)

在您的情况下,您需要这样使用:
^100\.00$|([3-9]|[1-9][0-9])+(\.\d{1,2})$
(示例)


此表达式将尝试将
100.00
作为一个整体进行匹配(这是您的上限,或者是
3.00
99.99
之间的任何数字)。您可以尝试此配对

^(?:100(?:\.0+)?|(?:[3-9]|[1-9][0-9])(?:\.\d{1,2})?)$

解释

  • ^
    -锚点表示字符串的开头
  • (?:100(?:\.0+)
    -这将匹配100100.0100.00(任意数量的小数点零)
  • |
    -此选项的工作原理与逻辑OR相同
  • (?:[3-9]|[1-9][0-9])(?:\.\d{1,2})
    -这将匹配3.00到99.99之间的任何数字
暗示


始终使用非捕获组,以防您在正则表达式中的任何其他位置不再使用该组。

当与最后的
100
交替使用时,对
\.\d?[1-9]
使用负前瞻,以确保小数位数(如果有)只有0

由于组末尾的
+
,您的第一个模式还可以匹配可选小数点之前的许多重复数字(如333和101010),因此如果您只想匹配3到100,最好删除
+

^(?:[3-9]|[1-9][0-9]|100(?!\.\d?[1-9]))(?:\.\d{1,2})?$
                        ^^^^^^^^^^^^^^

要允许前导零,请在
^
后面添加
0*

^0*(?:[3-9]|[1-9][0-9]|100(?!\.\d?[1-9]))(?:\.\d{1,2})?$
 ^^

也许这个正则表达式适用于您:

^([3-9]|[1-9][0-9])(\.[0-9]+)?$|^100(\.0+)?$
测试:


100
上的实际变化是什么,应该允许通过?很抱歉,我已经用值333进行了测试,它没有限制。只允许100.00。不允许任何其他内容。试试看。@CodeManiac:我想有人因为这个问题疯狂地投了反对票。@npinti但这不好:(看到好的答案获得了否决票。这很好,但它不接受03或012等值,但我没有在原始问题中添加这些值,对此表示抱歉。@npinti答案也适用于少数边缘情况。@user3910075如果您希望允许这样的前导零,请将开头的
^
替换为
^0*
,否如果需要进行其他更改,则零将被使用(如果存在),而不会影响其余部分pattern@revo是的,我错过了窍门。我已经更新了答案。谢谢你指出:)这将匹配
100。
,不应该
100(?:\.0*)?
100(?:\.0+)?
@Liinux是的,它应该匹配100。这与预期的一样工作,但我们需要在中输入100.00来传递正则表达式,而不是100。op要求它匹配100.000,实际上它应该匹配not@user3910075:您可以尝试使用以下命令:
^100.00$|([3-9]|[1-9][0-9])+(\.\d{1,2})?$
。它几乎可以工作:),但它也匹配
0120
,这等于120@user3910075:我在链接的站点上尝试了您的两个示例,但不匹配,正如预期的那样,
0120
应被拒绝,但已被接受。@CeratainPerformance在其评论/回答中修复了此问题