Perl中用于GPA的正则表达式

4
我是Perl和正则表达式的新手,我试图编写一个正则表达式来匹配0.0到4.0之间的GPA。所有匹配值都只能是由一个句点分隔的两个数字(1.23.40.2等)。
^[0]|[0-3]\.(\d?\d?)|[4].[0]$

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

3个回答

4

这里有几个答案看起来过于复杂。相反,这个简单的正则表达式应该可以胜任:[0-3]\.\d|4\.0,假设单个数字形式(例如“1”)不是有效输入。(我不知道在我来自的地方是否安全使用GPA。)

像其他人在这里使用的锚点前后:

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

如果您不需要捕获组:

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

完整解释:正则表达式匹配0、1、2或3中的任意一个,后跟一个句点和任意一个数字,或者匹配字面字符串4.0。

0

试试这个:

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

它使用称为负向预查和负向后查的(?<! )(?! )。这确保了在正则表达式之前或之后没有\d。它不会在正则表达式中匹配,只是检查它是否在其后面。 此外,使用此正则表达式,您不仅限于通过行分隔的值。

(根据caimarvo的建议进行修改)


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

这个有效,同样的思路向前和向后查找额外的字符。


使用{1}是没有意义的;可以省略它。即便如此,这似乎还是过于复杂了。 - Stig Brautaset

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接