我正在尝试用Ruby写一个正则表达式,它将解析各种日期/时间格式。整个正则表达式如下:
ListView
我正在使用命名组,以便我可以使用简单的名称(例如“ year”,“ month”,“ day”等)从匹配对象中提取匹配的部分。此正则表达式工作正常,但让我们在此末尾关注“偏移”:
/^(?<year>\d{4})\-(?<month>\d{2})\-(?<day>\d{2})(T(?<hour>\d{2})(:(?<minute>\d{2})(:(?<second>\d{2}(\.\d{1,3})?))?)?)?(?<offset>[+-]\d{2}:\d{2})?$/
问题是我正在尝试在字符串末尾添加解释“ Z”的功能,以表示UTC时间(又名Zulu时间)。此“ Z”应与偏移量互斥。这是我尝试过的一些方法:
(?<offset>[+-]\d{2}:\d{2})?
这些都不起作用。在前两种情况下,它可以解释以“ Z”结尾的日期字符串,但是它不再能够解释以“ -07:00”之类的实际偏移量结尾的日期字符串。在第三种情况下,匹配对象完全没有命名的组“ zulu”和“ offset”。
我认为这个问题是因为我正在尝试使用方括号来表示(?<offset>[Z([+-]\d{2}:\d{2})])?
(?<offset>[(Z)([+-]\d{2}:\d{2})])?
[(?<zulu>Z)(?<offset>[+-]\d{2}:\d{2})]?
,但是我不认为正则表达式引擎喜欢在方括号内包含组。我如何告诉正则表达式引擎允许并捕获“ A组或B组,或两者都不是,但不能同时捕获”?
答案 0 :(得分:1)
方括号用于“恰好是这些字符中的任何一个”,这不是您所需要的。模式级交替通过|
运算符完成:(hello|goodbye) world
将与hello world
或goodbye world
匹配。
(?<offset>Z|[+-]\d{2}:\d{2})?
不过,特别是要解析日期时间,我建议使用DateTime.parse
(如果需要Time实例,最好加上to_time
)。并且如果这还不够灵活,请考虑使用chronic gem。