如果字符串不存在,则添加字符串。

6

我有来自第三方的一些时间字符串(多么富有诗意),其中一些带有时区信息,而其他一些则没有。我想要做的是在缺少时区信息的情况下添加时区。

这里是一些带有时区信息的字符串示例...

5:21 AM MT
10:01 PM MT
8:41 PM MT

但是有时,由于某些原因,MT 会丢失。

所以,我需要做的就是在 AMPM 后添加 MT,如果它缺失的话。

(请注意,我不能仅仅检查 MT。它可以是任何时区。这里的主要目标是能够在 AMPM 后添加我选择的任何时区)。


你能检查一下AM/PM之后是否有其他内容吗?可能还有其他字符串吗? - squiguy
是的,你可以检查一下。基本上,“如果AM/PM后面没有任何内容,则添加时区”。 - Shpigford
7个回答

9

我不喜欢这些中的任何一个,所以我决定如果存在就将其chomp掉,然后再添加回来。在你的情况下:

"#{time.chomp(' MT')} MT"

编辑:这实际上对于OP编辑后的用例无效(多个不同的时区),但却非常有用于原始用例和潜在从Google(像我一样)找到此内容的人们!


2
>> s = 'foobar'

>> s.ends_with?('bar') ? s : "#{s}bar"

=> "foobar"

>> s = 'foo'

>> s.ends_with?('bar') ? s : "#{s}bar"

=> "foobar"

2

如果AM/PM指示器总是在那里,我可能会检查字符串的结尾,然后在必要时添加:

if string.match(/\ (A|P)M$/)
  string << " #{timezone}"
end

如果不是24小时制,您最好通过DateTime解析器解析字符串,并在将字符串转换为适当的对象后附加时区。请勿添加解释并保留HTML标签。

2
match-method 可以被替换为 .end_with?('AM', 'PM')。 - hirolau
@hirolau,我认为你的建议更好。也许在stringmatch之间插入rstrip! - Cary Swoveland

0
一个非正则表达式的解决方案:
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"]

0
从我使用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""PM"结尾,则返回nil,在Ruby中为false,导致&&条件短路。
  • 如果字符串以"AM""PM"结尾,则Ruby返回匹配的字符串,如第二个示例中所示,触发&&(和)并附加' MT'

-1
time_string.sub(/([AP]M){1}$/, '\1 MT')

-2
所以,如果字符串包含未跟随一个空格和一堆大写字母以“T”结尾的 AMPM,则在 AMPM 后追加 MT
timezone_string.sub(/( [AP]M)(?! [A-Z]+T)/,'\1 MT')

他说它可以是任何时区,这不是一个有效的检查。 - Eugene
这个正则表达式没有检查 MT。请注意,ESTGMTCEST 等都可以通过。但如果时区不存在,则会附加 MT - pobrelkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接