嗨,我正在尝试为货币创建正则表达式。小数点后的部分工作正常。然而,我对第一部分有问题。我希望它能接受以下数字:
00.12
0.12
00
0
但不是像这样以零开头的数字
0012.12
00023
这就是我所拥有的,但我无法让它工作
^([1-9][0-9]*|0|00)+(.(d){2})?$
您需要删除第一个捕获组上的量词+
——它将允许多次重复0
或00
。换句话说,000
、0000
、00000
等将被视为有效的字符串的前导部分。分组允许三种类型中的任何一种。所以像这样的正则表达式
^(0{1,2}|[1-9]d*)([.]dd)?$
将实现您的目标。
https://regex101.com/r/Tb1x6x/2/
您只需要从字符串的前面检查是否有1个或多个后面跟着1到9位的零。这种逻辑意味着所需的regex模式可以保持非常简单。
代码:(演示(
$tests = [
'00.12',
'0.12',
'00',
'0',
'0012.12',
'00023',
];
foreach ($tests as $test) {
echo $test . (preg_match('~^0+[1-9]~', $test) ? ' fail' : ' pass') . "n";
}
输出:
00.12 pass
0.12 pass
00 pass
0 pass
0012.12 fail
00023 fail
为了纠正你的完整模式,你不需要第一组上的量词:(演示(
echo preg_match('~^(?:[1-9]d*|0{1,2})(?:.d{2})?$~', $test) ? ' pass' : ' fail'
但老实说,为什么不把它们当作浮点数,而不是拒绝带前导零的值呢?(演示(为了更好的用户体验,我可能会这么做。或者只是用number_format()
标准化输入数字。(演示(听起来可能是XY问题。
[编辑]
现在,我的答案符合实际要求:
^(0{1,2}|([1-9][0-9]*))(?:.[0-9]{2})?$
您可以在此处尝试:https://regex101.com/r/8KJhk3/5