Perl中的GPA正则表达式

问题描述:

我是新来的Perl和正则表达式的世界,我试图编写一个正则表达式匹配0.0到4.0之间的GPA。所有匹配的值只能是两个数字,用句点分隔(1.2,3.4,0.2等)。Perl中的GPA正则表达式

^[0]|[0-3]\.(\d?\d?)|[4].[0]$ 

这是我的,但它是不正确的,因为它匹配“1.22”,“4a0”,“14.0”和“2.”。如果有人有任何建议,他们将不胜感激。

这里的几个答案似乎不必要的复杂。相反,这个简单的正则表达式应该这样做:[0-3]\.\d|4\.0,假设单数字形式(例如'1')不是有效的输入。 (我来自哪里等等人,我不知道这是否是一个安全的假设,我们不使用GPA)

随着锚正面和背面,因为我在这里看到别人用:

^([0-3]\.\d|4\.0)$ 

或者,如果你不需要捕获组:

^(?:[0-3]\.\d|4\.0)$ 

,完整的解释:正则表达式匹配要么 0,1,2,或3后跟一个周期,任何一个数字,或者字串4.0。

试试这个:

(?<!\d)([0-3](\.\d?)|4(\.0)?)(?!\d) 

它采用(?<!)(?!)被称为提前后面负的外观和负的样子。这确保\d在正则表达式之前或之后不存在。它在正则表达式中不匹配,只是检查它不在它之后。 此外,有了这个正则表达式,你不仅限于用行分隔的值。

(根据caimarvo建议修改)

^[0-3]{1}(\.\d{1}?)(?!\d)|(?<!.)4\.0?(?!.)$ 

这工作,同样的想法看起来进取,为后面多余的字符。

+0

使用'{1}'是毫无意义的;只是省略它。即便如此,这似乎也不必要的复杂。 – 2013-04-28 22:23:44