我需要一个只接受小数到两位小数的正则表达式。我已经尝试过^d{1,}(.d{2})?$'
,但我不希望它使用可选组,因为这将允许1
通过。如果去掉可选组,它将不允许1.00
通过。
我的代码:
[double]$bookPrice = read-host "Enter book price "
if($bookPrice -notmatch '^d{1,}(.d{2})?$'){
[console]::beep(500,300)
Write-Host "invalid"
}
有效:
1.00
1.12
无效:
1
1.000000
我认为唯一能解决问题的是将变量$bookPrice
更改为字符串,但我不想浪费一行时间将其转换回double。
我认为你在这里问错了问题,因为一旦你转换为double,你的正则表达式就永远无法在"1.00"上工作
将字符串转换为[double]$bookPrice
时,后面的零将消失。双精度不会存储无意义的数字。如果用户键入1.00
,则$bookPrice
变量仅为"1",如果用户键入1.10
,则仅为"1.1"——当与double匹配时,多余的尾随零将不会显示(您将double强制转换回字符串)。
当然,如果你只关心数字的字符串表示,那么你可以指定像"{0:n2}" -f $bookPrice
这样的输出格式,以确保你总是有两个并且只有两个小数位。。。
[d]*?[.][d]{2}(?=[sW])
考虑到python编写,但请查看:https://regex101.com/r/lT8xD9/1来解释正在发生的事情。我认为它应该满足你的需求,但我对此也有点陌生。