我正在尝试创建一个接受以下值的正则表达式:
我提出了([0-9]){0,2}\.([0-9]){0,2}
对我说“数字0到9出现0到2次,然后是'。'字符(应该是可选的),后面跟着数字0到9,出现0到2次。如果只输入2位数,则为'。'没有必要。这个正则表达式有什么问题?
答案 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)
你的正则表达式存在一些问题:
\.
)。更好的模式可能是:
/\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:]]
。