我有来自第三方的时间串(多么诗意),有些有时区,而有些则没有。如果一个时区不存在,我想做的附加一个时区。
以下是带有时区的字符串示例...
5:21 AM MT
10:01 PM MT
8:41 PM MT
但有时MT
无论出于何种原因,它都会丢失。
所以,我需要做的是在它丢失MT
之后附加。AM
PM
(注意,我不能只检查MT
。它可以是任何时区。这里的主要目标是能够附加我在AM
或之后选择的任何时区PM
)。
我不喜欢其中的任何一个,所以我决定chomp
如果它存在就将其关闭,然后再次添加它。在你的情况下:
"#{time.chomp(' MT')} MT"
编辑:这实际上不适用于 OP 编辑的用例(许多不同的时区),但对原始用例和可能从 Google 找到它的人(比如我!)都很有用。
如果 AM/PM 指示器总是在那里,我可能会检查字符串的结尾是什么,然后在必要时附加:
if string.match(/\ (A|P)M$/)
string << " #{timezone}"
end
如果不是(即:24 次),您最好通过 a Date
orTime
解析器解析字符串,并在将字符串转换为适当的对象后以这种方式附加时区。
>> s = 'foobar'
>> s.ends_with?('bar') ? s : "#{s}bar"
=> "foobar"
>> s = 'foo'
>> s.ends_with?('bar') ? s : "#{s}bar"
=> "foobar"
非正则表达式解决方案:
strings = ['5:21 AM MT', '8:41 PM MT', '8:41 AM']
timezone = ' MT'
p strings.map{|time| time.end_with?('AM', 'PM') ? time+timezone : time}
#=> ["5:21 AM MT", "8:41 PM MT", "8:41 AM MT"]
借用我的 Perl 日子:
str = '5:21 AM MT'
str # => "5:21 AM MT"
str[/[AP]M$/] # => nil
str[/[AP]M$/] && str << ' MT'
str # => "5:21 AM MT"
str = '5:21 AM'
str # => "5:21 AM"
str[/[AP]M$/] # => "AM"
str[/[AP]M$/] && str << ' MT'
str # => "5:21 AM MT"
你问它是如何工作的?str[/[AP]M$/] && str << ' MT'
是神奇的东西。查看str[/[AP]M$/]
行的结果:
"AM"
or结尾"PM"
,则nil
返回,这在 Ruby 中为 false,导致&&
条件短路。"AM"
or结尾"PM"
,Ruby 返回匹配的字符串,如第二个示例所示,它触发&&
(and) 和 appends ' MT'
。time_string.sub(/([AP]M){1}$/, '\1 MT')
因此,如果字符串包含一个AM
orPM
后面不跟一个空格和一堆以 结尾的大写字母,请在or之后T
追加?MT
AM
PM
timezone_string.sub(/( [AP]M)(?! [A-Z]+T)/,'\1 MT')