【发布时间】:2013-04-26 02:59:45
【问题描述】:
我是 Perl 和正则表达式世界的新手,我正在尝试编写一个匹配介于 0.0 和 4.0 之间的 GPA 的正则表达式。所有匹配值只能是 2 位数字,用句点分隔(1.2、3.4、0.2 等)。
^[0]|[0-3]\.(\d?\d?)|[4].[0]$
这是我所拥有的,但它不正确,因为它匹配“1.22”、“4a0”、“14.0”和“2.”。如果有人有任何建议,他们将不胜感激。
【问题讨论】:
我是 Perl 和正则表达式世界的新手,我正在尝试编写一个匹配介于 0.0 和 4.0 之间的 GPA 的正则表达式。所有匹配值只能是 2 位数字,用句点分隔(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)$
完整说明:正则表达式匹配任一 0、1、2 或 3,后跟句点和任何单个数字,或文字字符串 4.0。
【讨论】:
^[0-3]{1}(\.\d{1}?)(?!\d)|(?<!.)4\.0?(?!.)$
这行得通,同样的想法会前后观察额外的字符。
【讨论】:
{1} 是没有意义的;只是省略它。即便如此,这似乎是不必要的复杂。
试试这个:
(?<!\d)([0-3](\.\d?)|4(\.0)?)(?!\d)
它使用(?<! )和(?! ),称为负向向后看和负向向前看。这确保\d 在正则表达式之前或之后不存在。它在正则表达式中不匹配,只是检查它不在它之后。
此外,使用此正则表达式,您不仅限于用行分隔的值。
(根据caimarvo建议修改)
【讨论】: