gpt4 book ai didi

ruby - 正则表达式的问题

转载 作者:数据小太阳 更新时间:2023-10-29 08:43:31 25 4
gpt4 key购买 nike

字符串是:1/9/2017

我的正则表达式是:/([0-9]{1,2})\/[0-9]{1,2}\/([0-9]{4})/

这是我的代码行:

  def session_formatter(string)
if string =~ /([0-9]{1,2})\/[0-9]{1,2}\/([0-9]{4})/
year = $2
if $1 =~ /8|9|10|11/
"Fall " + year
elsif $1 =~ /1|2|3/
"Spring " + year
else
string
end
end
end

我返回的是 1/9/2017 而不是 Spring 2017 我不知道为什么。有任何想法吗?

最佳答案

我不会使用正则表达式来处理:

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 对 Date.parse(...) 使用最常见的格式 dd/mm/yyyy,这在解析基于美国的日期时可能会遇到问题。相反,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 “命名捕获组”的文档。

关于ruby - 正则表达式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40918987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com