RegEx 用于查找特定位置的字符

问题描述 投票:0回答:2

我有一系列格式为 yy MM dd 样式的日期:

981105
030730
140228
240422

我想使用一系列正则表达式来解析这些内容,首先匹配年份,然后匹配月份,然后匹配日期。

我想出了如何匹配前两位数字:

^\d{1}[0-9]

但是我被难住了。任何帮助将不胜感激。

regex
2个回答
2
投票

使用捕获组提取每对数字:

\b(\d{2})(\d{2})(\d{2})\b

捕获组 1 包含年份,组 2 包含月份,组 3 包含日期。


0
投票

您希望将字符串分解为年、月和日,这表明您可能希望在进一步的计算中使用该信息(例如,而不是仅打印出这三个值)。如果是这样,您可能希望将字符串转换为

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 年不是闰年。当使用普通的字符串方法或函数时,这显然是一个不简单的任务。

© www.soinside.com 2019 - 2024. All rights reserved.