如何编写与具有以下属性的字符串匹配的正则表达式?
123
或123.4
或123.56
)。.12
)。000.12
,只能是0.12
)时才能写入。答案 0 :(得分:3)
在小数点左边,您想要一个不以零开头的数字(1个或多个数字):
[1-9][0-9]*
也可以只是零:
0|[1-9][0-9]*
该值可以有一个小数点和小数点后的1-2位:
\.[0-9]{1,2}
需要左侧。小数点和小数位是可选的:
(?:0|[1-9][0-9]*)(?:\.[0-9]{1,2})?
需要第一个非捕获组来限制|
模式的范围。需要第二个非捕获组来使组合的“小数点和小数位”模式成为可选。
请注意,这将允许尾随零,例如100.00
根据喜好,[0-9]
也可以写为\d
。我通常会使用\d
,但是由于regex也具有[1-9]
,因此我在这里更喜欢[0-9]
,因为我认为这有助于弄清差异。
取决于正则表达式的使用方式,您可能需要添加^
开始/ $
结束锚。使用find()
时需要使用它们,使用matches()
时不需要使用它们,但不会造成伤害:
^(?:0|[1-9][0-9]*)(?:\.[0-9]{1,2})?$
答案 1 :(得分:3)
使用负数预读以确保字符串不以零和另一个数字开头(但可以是零,也可以是零,后跟一个点)
^(?!0\d)\d+(?:\.\d{1,2})?$
说明和示例:https://regex101.com/r/7ymqcn/1
P.S。比Andreas的答案还高效(只需更少的步骤即可进行匹配)
答案 2 :(得分:-1)
您可以尝试将输入字符串转换为 float (这将删除前导零和不包含零的点,并在输入仅为整数的情况下添加“ .00”,以及您可以设置最大十进制数。如果在转换时抛出异常,则输入与您想要的不匹配。然后您可以将浮点数转换回字符串或将其保留为浮点值以进行计算。
请参阅: https://docs.oracle.com/javase/7/docs/api/java/lang/Float.html#valueOf(java.lang.String)