附加字符串(如果尚未存在)

时间:2013-10-30 16:37:24

标签: ruby regex string

我有来自第三方的一些时间(多么富有诗意),有些人拥有时区,而其他人却没有。如果没有时区,我想做的是附加一个时区。

以下是带时区的字符串示例...

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

但有时候MT因任何原因而遗失。

所以,我需要做的是在MT之后追加AMPM如果它丢失了。

(注意,我不能只检查MT。它可以是任何时区。这里的主要目标是能够追加我在AM或{之后选择的任何时区{1}})。

7 个答案:

答案 0 :(得分:4)

我不喜欢其中任何一个,所以如果它存在,我决定只关闭chomp然后再添加它。在你的情况下:

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

编辑:这实际上不适用于OP编辑的用例(许多不同的时区),但 对原始用例以及可能从Google发现此问题的人都有用(就像我一样!)

答案 1 :(得分:2)

如果AM / PM指示符始终存在,我可能只是检查字符串的结尾,然后在必要时附加:

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

如果不是(即:24次),最好通过DateTime解析器解析字符串,并在将字符串强制转换为适当的对象后附加时区。

答案 2 :(得分:1)

>> s = 'foobar'

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

=> "foobar"

>> s = 'foo'

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

=> "foobar"

答案 3 :(得分: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"]

答案 4 :(得分: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'

答案 5 :(得分:-1)

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

答案 6 :(得分:-2)

因此,如果字符串包含AMPM后面没有空格和一串以T结尾的大写字母,请在{MT之后追加AM 1}}或PM

timezone_string.sub(/( [AP]M)(?! [A-Z]+T)/,'\1 MT')