RegEx,0,1-9.1-9还是10.0?

时间:2018-02-13 00:07:36

标签: regex

我需要一个RegEx来验证输入的数字

  • 0
  • 1-9 一位小数(即5.5,但不是3.33或7
  • 10.0

我尝试使用以下RegEx,但我没有成功..

/(0|[1-9]\.[1-9]|\10.0)/g

fyi,在我的系统中,' 0'表示没有输入等级',10.0是最大值,最小值是1.0

3 个答案:

答案 0 :(得分:3)

您遇到问题可能是因为您错过了开始和结束标记,例如^$,因此,您的解决方案不会受到整个输入的限制。尝试:

/^(0|[1-9]\.[0-9]|10\.0)$/g

答案 1 :(得分:1)

我认为这个更健壮吗?

^0$|^[1-9]{1}\.[0-9]{1}$|^10\.0$

要担心的主要问题是上面的内容会匹配12.0,因为0没有锚定。您还希望在十进制大小写中使用{1}量词,并在小数点后包含[0-9](因此7.0匹配)。

编辑:变更说明

  • ^$添加到三个选项中的每一个都可确保匹配是整个字符串。这意味着,例如,^0$0匹配,但与0.0016.00仅为[1-9]的任何其他字符串不匹配字符串的一部分。
  • 将第二个选项中小数点后的[0-9]更改为7.0,可以{1}匹配,之前不会
  • 将量词[]添加到第二个选项中小数点之前和之后的[1-9]\.[0-9]组,可确保我们只匹配一个数字。以前,12.1会匹配5.33^以及匹配仅包含在字符串中的其他字符串。它们在$\方面有些多余,但对于正则表达式我喜欢故障...
  • 我还将第三个选项中的转义.移到了小数点之前,这似乎是一个错字(我们希望匹配文字.而不是使用$window来表示任何角色)

答案 2 :(得分:1)

我的建议:

(?<![0-9.])(0|(?:[1-9]\.[0-9])|(?:10\.0))(?![0-9.])

以下所有内容将匹配:0,1.1,1.0,1.9,2.0,2.1,9.0,9.1,9.9,10.0,但以下所有内容均不会:0.1,0.2,0.9,1.11,1.20,1.01, 10.05,110.05。每行不需要一个数字,可以提取文本中嵌入的数字。

以下是示例:regex101

更详细的解释:

(?<![0-9.])

是一种后视,可以防止我们在多行输入中删除数字文字,例如:不应匹配10000010.0。

(0|(?:[1-9]\.[0-9])|(?:10\.0))

这是符合您的规格的部分。仅当您希望保留匹配的群组时才需要?:&#34;清洁&#34;,因为中间案例不会有group(2)

(?![0-9.])

这是另一个向前看,再次:仅对多行文字很重要。

如果你放弃了后视,前瞻和&#34;环保型比赛组&#34;,你最终得到的结果如下:

0|([1-9]\.[0-9])|(10\.0)

如果您使用的是每行一项输入,则可以添加前缀^和后缀$,然后继续使用。