正则表达式,无前导点,最大为前导零

时间:2018-07-05 17:12:36

标签: java android regex

如何编写与具有以下属性的字符串匹配的正则表达式?

  1. 不仅包含数字,还包含作为小数点分隔符的点(但点不是必需的,这意味着它可以是123123.4123.56)。
  2. 没有前导点(不是.12)。
  3. 前导零只有在其后跟一个点(不能像000.12,只能是0.12)时才能写入。
  4. 只有2个小数位。

3 个答案:

答案 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)