我有一系列格式为 yy MM dd 样式的日期:
981105
030730
140228
240422
我想使用一系列正则表达式来解析这些内容,首先匹配年份,然后匹配月份,然后匹配日期。
我想出了如何匹配前两位数字:
^\d{1}[0-9]
但是我被难住了。任何帮助将不胜感激。
使用捕获组提取每对数字:
\b(\d{2})(\d{2})(\d{2})\b
捕获组 1 包含年份,组 2 包含月份,组 3 包含日期。
您希望将字符串分解为年、月和日,这表明您可能希望在进一步的计算中使用该信息(例如,而不是仅打印出这三个值)。如果是这样,您可能希望将字符串转换为
date
对象,前提是您的计算机语言提供该支持。
在您的第一个示例中,
'981105'
,您的软件将不知道'98'
是否指的是1995年、2095年或1195年。例如,如果最早可能的年份是1990年,最后可能的年份是2089年,您可能会使用如下方法将字符串从 6 位扩展到 8 位(在 Ruby 中,您可以将其视为伪代码)。
def date_string_with_full_year(date_string)
year = date_string[2].to_i
if year >= 1990 and year < 2000
date_string = "19" + date_string
else
date_string = "20" + date_string
end
end
例如,
date_string_with_full_year('981105')
#=> "19981105"
date_string_with_full_year('240422')
#=> "20240422"
许多计算机语言提供了将此 8 个字符的字符串转换为日期对象(或以其他方式将该字符串视为表示日期)的方法,然后可以通过多种方式对其进行操作。
例如,在 Ruby 中,这可以使用方法 Date::strptime 来完成。
require 'date'
d = Date.strptime('20240422', '%Y%m%d')
#=> #<Date: 2024-04-22 ((2460423j,0s,0n),+0s,2299161j)>
由变量
d
保存的日期对象可以用于多种用途。例如,我们可以检索年、月、日和星期几:
d.year #=> 2024
d.month #=> 4 (January is 1)
d.day #=> 22 (First day of month is 1)
d.wday #=> 1 (Sunday is 0)
d >> 2 #=> #<Date: 2024-06-22 ((2460484j,0s,0n),+0s,2299161j)>
最后一个日期是
2
给出的日期后 d
个月的日期。
还可以使用日期对象来执行日期运算。例如,假设我们想知道
d
给出的日期与 2026 年 7 月 11 日之间的天数。我们可以写
r = Date.strptime('20260711', '%Y%m%d') - d
#=> (810/1)
我们可以将这个有理数转换为整数:
r.to_i #=> 810 days
尝试将日期字符串转换为日期对象也会识别无效的日期对象。
例如:
Date.strptime('20230229', '%Y%m%d')
#=> Date::Error: invalid date
该日期无效,因为 2023 年不是闰年。当使用普通的字符串方法或函数时,这显然是一个不简单的任务。