【问题标题】:Ruby valid license plate regexRuby 有效车牌正则表达式
【发布时间】:2016-12-16 23:11:47
【问题描述】:

我正在尝试用 RUBY 编写一个函数,该函数将确定给定字符串是否是有效的车牌。有效的车牌格式如下:3 个大写字母,后跟一个破折号,后跟 4 个数字。例如:HES-2098.

我编写了以下函数,但需要一些关于模式匹配的帮助。

def liscence()
  plate = "HES-2098"
  plateNo = plate.upcase
 if(plate.length == 8)

   if(plate == plateNo)

    if(/\A-Z\A-Z\A-Z\-\d{4}/.match(plate))
       puts "valid"
     else
       puts "invalid"
     end


   else
     puts "First 3 letter must be uppercase"
   end

 else
   puts "Only 8 char long"

 end

end

liscence()

【问题讨论】:

  • if(/\A[A-Z]{3}-[0-9]{4}\z/.match(plate))
  • 谢谢!解决了我的问题
  • 我发布了带有解释和演示的模式。
  • Rubular 是你的朋友。见rubular.com/r/9Kn4fk96ci

标签: ruby regex pattern-matching


【解决方案1】:

您的正则表达式不起作用,因为\A 匹配的字符串起始位置只能是字符串中的一个(而您有三个)。要匹配大写 ASCII 字母,您可以使用 [A-Z] 字符类。

你可以使用

if /\A[A-Z]{3}-[0-9]{4}\z/ =~ plate

查看regexRuby 演示。

模式详情

  • \A - 字符串的开头(不是行,与 ^ 一样)锚点
  • [A-Z]{3} - 正好 3 个(因为使用了限制量词 {n})大写 ASCII 字母(来自字符类中的 [A-Z] 范围)
  • - - 文字连字符(不必在字符类之外转义)
  • [0-9]{4} - 正好 4 个 ASCII 数字
  • \z - 字符串锚点的最后(不是匹配行尾的$

【讨论】:

    【解决方案2】:
    plate[/\A[A-Z]{3}-\d{4}\z/] ? 'valid' : 'invalid'
    

    【讨论】:

    • afaik plate =~ /regex/plate[/regex/] 快约 30%
    • @smefju 它不能只是N% faster,因为它应该强烈依赖于字符串长度,而且当没有匹配时它无论如何都不会有所不同。对于 plates 来说,考虑这一点称为“过早优化”。应该使用一种更容易阅读的变体,并且在我看来,我介绍的那个读起来更好。后者当然是有争议的:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2013-09-29
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多