一个将解析00.00的正则表达式

时间:2009-08-06 13:37:04

标签: regex

我正在尝试创建一个接受以下值的正则表达式:

  • (空白)
  • 0
  • 00
  • 00.0
  • 00.00

我提出了([0-9]){0,2}\.([0-9]){0,2}对我说“数字0到9出现0到2次,然后是'。'字符(应该是可选的),后面跟着数字0到9,出现0到2次。如果只输入2位数,则为'。'没有必要。这个正则表达式有什么问题?

5 个答案:

答案 0 :(得分:15)

你没有使点可选:

[0-9]{0,2}(\.[0-9]{1,2})?

答案 1 :(得分:3)

首先,{0-2}应该是第一个实例中的{0,2}

其次,您还需要对重复部分进行分组。

第三,你需要让整个最后一部分成为可选的。因为如果有一个点,后面必须有一些东西,你也应该将第二个重复的东西改为{1,2}

([0-9]{0,2})(\.([0-9]{1,2}))?

答案 2 :(得分:2)

你的正则表达式存在一些问题:

  1. 点是一个特殊字符,充当通配符;如果你想要一个文字点,你需要将其转义(\.)。
  2. 即使您将点替换为不是通配符,您的正则表达式也会匹配“0”之类的字符串。因为如果后面有数字,你没有告诉正则表达式引擎只匹配点。
  3. 因为你的表达式不是anchored,所以它可以匹配包含另一个单词中的模式的字符串(例如,ab12会匹配)。
  4. 更好的模式可能是:

    /\b[0-9]{0,2}(?:\.[0-9]{1,2})?\b/
    

    请注意(?:...)使得该组不会创建反向引用,在您的情况下可能不需要。

答案 3 :(得分:1)

这是Perl中的一种方式,用于匹配 您列出的字符串。重要的部分是它匹配空字符串的方法:它不会使每个模式元素都是可选的,这种策略具有匹配几乎每个字符串的不良影响。

use warnings;
use strict;

my @data = (
    '',
    '0',
    '00',
    '00.0',
    '00.00',
    'foo',    # Should not match.
    '.0',     # Should not match.
);

for (@data){
    print $_, "\n" if /^$|^[0-9]{1,2}(\.[0-9]{1,2})?$/;
}

答案 4 :(得分:0)

以上大多数示例都没有锚定数据的开头^和结尾$

我会用以下之一解决它:

  • ^[[:digit:]]{0,2}([.][[:digit:]]{1,2})$
  • ^\d{0,2}([.]\d{1,2})$
  • ^[0-9]{0,2}([.][0-9]{1,2})$

为了便于阅读,我通常更喜欢使用[.]\.并使用POSIX类,例如[[:digit:]]