Regex 我使用正则表达式将数字限制在3.00到100.00之间,但它允许数字在100.01到100.99之间
我有一个要求,将数字限制在3.00到100.00之间 我用下面的表达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-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})?)$
解释
-锚点表示字符串的开头^
-这将匹配100100.0100.00(任意数量的小数点零)(?:100(?:\.0+)
-此选项的工作原理与逻辑OR相同|
-这将匹配3.00到99.99之间的任何数字(?:[3-9]|[1-9][0-9])(?:\.\d{1,2})
始终使用非捕获组,以防您在正则表达式中的任何其他位置不再使用该组。当与最后的
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在其评论/回答中修复了此问题