正则表达式允许数字没有前导和结束0

时间:2015-08-19 08:56:46

标签: regex

我希望除了一些不同语法的数字,我想为这个任务/匹配找到最好的正则表达式。

首先是一些有效数字:

0.01
0.2
0.38
45
165.6
52732.08
999999999.99

这里有一些无效的数字:

.01
.2
.50
.85
45.
45.0
45.00
00045.0
124.60
000124.60
124,6
000053853.01
999.999.999,99
999999999,99

经过多次测试后,我创建了以下正则表达式:

^[1-9]?\d{1,9}\.?\d{1,2}(?<!0)$

但我总是在努力争取数字:000058723.01

有什么想法吗?感谢。

5 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式:

^(?!0+\d)\d+(?:\.(?![1-9]*0+$)\d{1,2})?$

或者:

^(?:0+|[1-9]\d*)(?:\.(?![1-9]*0+$)\d{1,2})?$

RegEx Demo

答案 1 :(得分:1)

尝试这种模式:

^((?:0|[1-9]+)(?:\.(?:\d+?[1-9]|[1-9]))?)$

Demo

答案 2 :(得分:0)

以下是正则表达式的固定版本:

^(?!0{2,})\d+(?:\.\d{1,2}(?<!0))?$

此处,前瞻(?!0{2,})不允许初始2个或更多零,并且小数部分在非捕获组(?:\.\d{1,2}(?<!0))?内可选。

请参阅demo

如果您不想与0匹配,可以在否定前瞻中排除这一点:

^(?!0{2,}|0$)\d+(?:\.\d{1,2}(?<!0))?$
          ^^

请参阅Demo 2

答案 3 :(得分:0)

您接受四种输入:

  1. 没有小数位且没有前导零的数字:[1-9]\d*

  2. 零后跟一个点后跟数字(不带尾随零):0\.\d*[1-9]

  3. 没有前导或尾随零的十进制数:[1-9]\d*\.\d*[1-9]

  4. 零:0

  5. 把四个放在一起:

    ^([1-9]\d*|0\.\d*[1-9]|[1-9]\d*\.\d*[1-9]|0)$
    

答案 4 :(得分:0)

带有可选小数的数字由两部分组成:整数部分和以点开头的可选小数部分。

整数部分为零(0)或以1..9开头的数字序列(无0)并且可以继续使用零个或多个数字:

0|[1-9][0-9]*

如果您需要对整数部分的长度施加上限,请将*替换为{,n},其中n是允许的最大长度减去1。

小数部分以点(.)开头,后跟零个或多个数字,后跟1..9之一(最后允许0)。

表达式是:

\.[0-9]*[1-9]

现在让我们把它们结合起来:

^(0|[1-9][0-9]*)(\.[0-9]*[1-9])?$

我加入作品时添加的内容:

  • ^ - 匹配字符串的开头;如果没有这个,则regex45.0;
  • 中的00045.0匹配 由于|; 的优先级较低,
  • 整数部分的括号
  • 小数部分周围的括号,后跟?表示整个小数部分是可选的;
  • $ - 匹配字符串的结尾,以避免与124.6匹配124.60

说明

以上regex旨在与您的示例相匹配。但是,请注意,大多数编程语言允许您放入“无效”部分的大部分或全部数字,并使用点(.)作为小数分隔符。许多语言提供的库函数能够解析使用逗号(,)作为小数分隔符的数字。

没有整数部分(.85)的数字,在带有尾随零(45.)的点(45.0)之后没有数字是有效的,并且没有歧义地解释。

唯一的麻烦制造者是领先的零(00045.0)。对于整数,大多数情况下,它是一个信号,表示数字用基数8表示,而对于实数,它只是被忽略。