Ruby 开发(七) - 正则表达式与时间日期

343 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情

一、正则表达式

正则表达式可以对内容进行限定或者提取,Ruby 中正则表达式是一个对象,因此可以给表达式发送信息,使用内置的方法接收正则表达式的参数,然后对字符串进行验证,为一个正则表达式指定一个模式,那么给定的字符串要么匹配模式,要么不匹配。

正则表达式说明
/a/匹配字符 a
/?/匹配特殊字符,^、$、.、/、\、[、]、(、)、+、* 等
.匹配任意字符
/[ab]c/匹配字符 ac 或者 bc,[] 表示范围
/^[a-zA-Z0-9]/^ 表示取反,匹配不再 a-z、A-Z、0-9 的字符串
/[\d]/匹配任意数字
/[\w]/匹配任意字母、数字或者下划线_
/[\s]/匹配任意空白符,空格、Tab、换行

正则表达式中的量词

正则表达式的量词说明例子
[]代表匹配的1个字符/[\w]/ 匹配0个或者多个字符
{n}代表匹配字符的个数,n 表示数字/d{3}/ 表示匹配三个数字
?代表匹配 0 个或者 1/\w?/ 匹配0个或者多个字符
*代表匹配 0 个或者多个/\w*/ 匹配0个或者多个字符
+代表匹配 1 个或者多个字符/\w+/ 匹配0个或者多个字符

Ruby 中通过正则表达式的 match 方法来实现正则表达式和字符串的匹配

if /[a-z]/.match "zulu"
  puts "字符串 zulu 可以匹配给出的正则表达式"
else
  puts "匹配失败"
end

if "yankee".match(/[a-z]/)
  puts "匹配成功"
else
  puts "匹配失败"
end

执行上述代码,输出结果如下:

字符串 zulu 可以匹配给出的正则表达式
匹配成功

除了 match 方法之外,还有一种判断字符串与正则表达式是否匹配的方式,既使用 =~ 操作符,如果有匹配的字符串会返回相应值的索引,否则返回 NilClass,而 match 方法如果有匹配的 字符串就输出匹配的字符串,否则输出为空既 NilClass

puts "Hello Ruby" =~ /Hello*/
puts "Hello Ruby" =~ /Ruby/
puts "Hello Ruby" =~ /zulu/
puts ("Hello Ruby" =~ /zulu/).class
puts "yankee".match(/[0-9]/)
puts "yankee".match(/[a-z]/)
puts ("yankee".match(/[0-9]/)).class

执行上述代码,输出结果如下:

0
6

NilClass

y
NilClass

从输出结果可以看出当字符串和正则表达式无法匹配的时候会返回一个空对象,类型为 NilClass。

re = /([a-z]+)-([A-Za-z]+)/
code = "Yankee-Zulu-Xray-Delta-Whiskey"
res = re.match(code)
puts res.class
puts res
puts "#{$1}"
puts "#{$2}"

执行上述代码,输出结果如下:

MatchData
ankee-Zulu
ankee
Zulu

match 方法可以返回一个 MatchData 对象,可以通过全局变量 $1$2 来访问,这里使用过 - 来区分第一个和第二个字符。

二、时间与日期

创建时间对象

Ruby 中可以使用 Time 类来生成一个当前时间的时间对象,并且可以通过这对象来获取当前的年、月、日

# 获取当前时间

time = Time.new

puts "当前时间是:#{time}"
puts "当前时间年份是:#{time.year}"
puts "当前时间月份是:#{time.month}"
puts "当前时间日是:#{time.day}"
puts "当前时间小时是:#{time.hour}"
puts "当前时间分钟是:#{time.min}"
puts "当前时间秒是:#{time.sec}"
puts "当前时间毫秒是:#{time.usec}"

执行上述代码,输出结果如下:

当前时间是:2022-06-16 19:34:10 +0800
当前时间年份是:2022
当前时间月份是:6
当前时间日是:16
当前时间小时是:19
当前时间分钟是:34
当前时间秒是:10
当前时间毫秒是:709704

除了使用 new 的方式还可以使用 mktime 和 local 方法来创建 Time 对象,使用 mktime 方法和 local 方法创建时间对象需要传递参数,参数的顺序依次是 年、月、日、分、秒、毫秒,除了年对应的参数是必填参数为,其他都是可选的。

time = Time.mktime(2022, 6, 16)
puts time
puts time.class

执行上述代码,输出结果如下:

2022-06-16 00:00:00 +0800
Time

还可以使用 gm 方法来创建时间对象,他使用的是 GMT 时区 和 UTC 时区,该方法传递的参数与 mktime 和 local 方法传递的参数一致。

time = Time.gm(2022, 6, 16)
puts time
puts time.class

执行上述代码,输出结果如下:

2022-06-16 00:00:00 UTC
Time

操作时间对象

时间对象可以通过 to_a 方法转换成为一个数组。

time = Time.gm(2022, 6, 16)
puts time
puts time.to_a

执行上述代码,输出结果如下:

2022-06-16 00:00:00 UTC
0
0
0
16
6
2022
4
167
false
UTC

索引从 0 开始对应的时间单位依次是:秒、分、时、日、月、年、星期、一年中的第几天、是否为夏令时、时区

Time 对象还可以通过 yday、mday、wday 来获取一年中的第几天、一个月中的第几天、一个星期中的第几天

time = Time.gm(2022, 6, 16)
puts time
puts "一年中的第几天:#{time.yday}"
puts "一个月中的第几天:#{time.mday}"
puts "一星期中的第几天:#{time.wday}"

执行上述代码,输出结果如下:

2022-06-16 00:00:00 UTC
一年中的第几天:167
一个月中的第几天:16
一星期中的第几天:4

使用 Time 对象相减就可以获取两个时间点之间的时间间隔,间隔单位为秒

time = Time.gm(2022, 6, 16)
time2 = Time.gm(2022, 6, 15)

diff = time - time2
puts diff

执行上述代码,输出结果如下:

86400.0

使用 Time 对象的 strftime 方法可以对日期进行格式化,常用的格式化指令如下:

  • %a:星期天数的缩写
  • %A:完整的星期天数
  • %b:月的名称缩写
  • %B:完整的月的名称的缩写
  • %d:一个月中的第几天(01-31)
  • %e:一个月中的第几天(1-31)
  • %H:24 小时制的时间
  • %I:12 小时制的时间
  • %m:月份
  • %M:分钟
  • %p:AM 或者 PM
  • %S:秒
  • %w:一个个星期中的第几天
  • %x:等价于 %m%d%y
  • %c:等价于 %a%b%d%H:%M:%S:%Y
time = Time.gm(2022, 6, 16)

puts time.strftime("%Y/%m/%d %H:%M:%S")
puts time.strftime("今天是 %x")
puts time.strftime("现在是 %c")
puts time.strftime("今天是 %B %a")

执行上述代码,输出结果如下:

2022/06/16 00:00:00
今天是 06/16/22
现在是 Thu Jun 16 00:00:00 2022
今天是June-Thu