而不是处理正则表达式我会使用:
str = '1/9/2017'
mm, dd, yyyy = str.split('/')
case mm.to_i
when 1, 2, 3
"Spring #{yyyy}"
when 8, 9, 10
"Fall #{yyyy}"
else
str
end
# => "Spring 2017"
正则表达式是伟大的,但人们爱用他们这么多,他们忽略方式的任务可能是做得更简单。并非所有的东西都是等待被正则表达式击中的钉子。
拆分/
降低了视觉噪音,使用to_i
可以更容易地阅读和理解when
正在做什么。
或者,使用Date类,它有各种各样的善良:
require 'date'
str = '1/9/2017'
date = Date.strptime(str, '%m/%d/%Y')
case date.month
when 1, 2, 3
"Spring #{date.year}"
when 8, 9, 10
"Fall #{date.year}"
else
str
end
# => "Spring 2017"
我用strptime
因为日期格式不为世人一致。 Ruby作为一种国际语言,使用最常见的格式dd/mm/yyyy作为Date.parse(...)
,这在解析美国日期时可能会遇到问题。相反strptime
让我迫使解析器将使用基于美国-MM/DD/YYYY形式:
require 'date'
Date.strptime('31/12/2001', '%d/%m/%Y') # => #<Date: 2001-12-31 ((2452275j,0s,0n),+0s,2299161j)>
Date.strptime('31/12/2001', '%m/%d/%Y') # => ArgumentError: invalid date
# ~> ArgumentError
# ~> invalid date
注意,第一个例子落在猎物这个特殊问题。处理日期时,如果允许用户输入日期作为自由格式的字符串,则知道用户来自何处非常重要,因此您至少可以猜测这些值的顺序。更好,友好的解决方案是使用具有某种类型的日期选择器的表单,这会迫使订单进入您的代码所期望的状态。不正确地处理日期可能会造成重大的破坏,涉及时间或金钱的计算,而您只是不希望发生这种情况。
如果日期是文件中文本的一部分,那么处理起来要容易一些,因为它应该一致地格式化,但是顺序仍然很重要。
如果你真的坚持使用的模式,我会去了解它是这样的:
str = '1/9/2017'
/(?<mm>[0-9]{1,2})\/[0-9]{1,2}\/(?<yyyy>[0-9]{4})/ =~ str
mm # => "1"
yyyy # => "2017"
case mm.to_i
when 1, 2, 3
"Spring #{yyyy}"
when 8, 9, 10
"Fall #{yyyy}"
else
str
end
# => "Spring 2017"
或者,为了增加乐趣:
str = '1/9/2017'
matches = /(?<mm>[0-9]{1,2})\/[0-9]{1,2}\/(?<yyyy>[0-9]{4})/.match(str)
mm, yyyy = matches[:mm], matches[:yyyy]
case mm.to_i
when 1, 2, 3
"Spring #{yyyy}"
when 8, 9, 10
"Fall #{yyyy}"
else
str
end
# => "Spring 2017"
见Ruby的Regexp文档“命名捕获组“。
可以肯定一看这里,一个真棒工具来快速检查您的正则表达式:http://rubular.com – Roger
让我知道,如果有人需要任何更多的信息 –