【问题标题】:Regex for GPA in PerlPerl 中 GPA 的正则表达式
【发布时间】:2013-04-26 02:59:45
【问题描述】:

我是 Perl 和正则表达式世界的新手,我正在尝试编写一个匹配介于 0.0 和 4.0 之间的 GPA 的正则表达式。所有匹配值只能是 2 位数字,用句点分隔(1.23.40.2 等)。

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

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

【问题讨论】:

    标签: regex perl


    【解决方案1】:

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

    前后都有锚,我在这里看到其他人使用:

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

    或者如果您不需要捕获组:

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

    完整说明:正则表达式匹配任一 0、1、2 或 3,后跟句点和任何单个数字,或文字字符串 4.0。

    【讨论】:

      【解决方案2】:
      ^[0-3]{1}(\.\d{1}?)(?!\d)|(?<!.)4\.0?(?!.)$
      

      这行得通,同样的想法会前后观察额外的字符。

      【讨论】:

      • 使用{1} 是没有意义的;只是省略它。即便如此,这似乎是不必要的复杂。
      【解决方案3】:

      试试这个:

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

      它使用(?&lt;! )(?! ),称为负向向后看和负向向前看。这确保\d 在正则表达式之前或之后不存在。它在正则表达式中不匹配,只是检查它不在它之后。 此外,使用此正则表达式,您不仅限于用行分隔的值。

      (根据caimarvo建议修改)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-27
        • 1970-01-01
        • 2012-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多