我是Perl和正则表达式的新手,我试图编写一个正则表达式来匹配0.0到4.0之间的GPA。所有匹配值都只能是由一个句点分隔的两个数字(
1.2
、3.4
、0.2
等)。^[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)$
试试这个:
(?<!\d)([0-3](\.\d?)|4(\.0)?)(?!\d)
(?<! )
和(?! )
。这确保了在正则表达式之前或之后没有\d
。它不会在正则表达式中匹配,只是检查它是否在其后面。
此外,使用此正则表达式,您不仅限于通过行分隔的值。
(根据caimarvo的建议进行修改)
^[0-3]{1}(\.\d{1}?)(?!\d)|(?<!.)4\.0?(?!.)$
这个有效,同样的思路向前和向后查找额外的字符。
{1}
是没有意义的;可以省略它。即便如此,这似乎还是过于复杂了。 - Stig Brautaset