2014-09-28 78 views
0

这是我的第一个问题(尽管过去我发现了许多完美的堆栈溢出问题的解决方案 - 这是我的第一个帮助源)。任何人都可以帮我干这个REGEX吗?

我有包含一个月份和一系列日期的文本字符串。有时候,字符串中有两个月。

date1 = "January 9, 10, 15, 16, 17, 18, 22, 23, 24" 
date2 = "September 19, 20, 25, 26, 27, 28, October 2, 3, 4, 10, 11" 

我写了一段非常WET的代码,从字符串中提取月份并添加每个日期,再加上年份。 但是,有几个问题我无法弄清楚。

  1. 穿过日期的ITERATING:我知道我应该使用EACH方法遍历日期。我尝试过,但我无法让它工作,所以我通过将每个月份与每个日期元素连接在一起来实现这一目标。这个问题的明显问题是,我不知道会有多少日期,所以我必须建立最长的字符串并使用IF语句来确定是否已达到字符串的末尾。我应该使用dates1.length = x加上DO EACH,但我无法使它工作。

  2. 协调月份日:我非常糟糕的湿代码尽可能将monrg一天一年地拖到一起,但我该如何摆脱括号和引号?

  3. 多月:我该如何选择字符串中的第二个月份,并且只连接月份名称后面的单个日期以获得MONTH/DD/YY?

这是我非常糟糕的代码的一个示例。

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

date1 = "January 9, 10, 15, 16, 17, 18, 22, 23, 24" 
date2 = "September 19, 20, 25, 26, 27, 28, October 2, 3, 4, 10, 11" 
datetext = date1.scan(/([\w\-]+)/)  #=> pulls the whole string 
datetext2 = date1.scan(/(\w*)\s?/)[0] #=> this pulls the month 
datenumbers = date1.scan(/(\d+)/) 
firstdate = datenumbers[0]    #=>ithe first date following the first month 
seconddate = datenumbers[1] 
year = "2014" 

mdy1 = "#{datetext2} #{firstdate} #{year}" 
mdy2 = "#{datetext2} #{seconddate} #{year}" 

puts date1 
puts " " 
puts datetext2 #=> this variable adds the [0] delimiter to pull the 1st month 
puts firstdate 
puts " " 
puts mdy1 
puts mdy2 
puts " " 
+1

加里,这里有一个关于问题的写作一些建议:1,消除所有多余的声明(例如,这里的三个“要求”陈述); 2.当你举一个例子(例子很好)时,总是显示所需的结果,并在适用的时候,得到不正确的结果。 – 2014-09-28 17:42:59

回答

0

我建议你做以下几点。

代码

def extract_dates_by_month(str) 
    str.scan(/[A-Z][a-z]+|\d+/).each_with_object([]) { |e,b| 
    e[0][/[A-Z]/] ? b << [e,[]] : b.last.last << e } 
end 

str = "September 19, 20, 25, 26, October 2, 3, 4, 10, November 3, 12, 17" 
extract_dates_by_month(str) 
    #=> [["September", ["19", "20", "25", "26"]], 
    # ["October", ["2", "3", "4", "10"]], 
    # ["November", ["3", "12", "17"]]] 

说明

的第一步是提取月份名称和天:

a = str.scan(/[A-Z][a-z]+|\d+/) 
    #=> ["September", "19", "20", "25", "26", "October", "2", "3", "4", "10", 
    # "November", "3", "12", "17"] 

我们再向上划分这个阵列分成月:

a.each_with_object([]) { |e,b| e[0][/[A-Z]/] ? b << [e,[]] : b.last.last << e } 
    #=> [["September", ["19", "20", "25", "26"]], 
    # ["October", ["2", "3", "4", "10"]], 
    # ["November", ["3", "12", "17"]]] 

Enumerable#each_with_object创建针对块变量b的最初为空的阵列和阵列通过该方法返回。将a的每个元素传递到块中,并由块变量e引用。执行以下操作:

b = [] 
e = "September" 
e[0][/[A-Z]/] #=> "S" 
b << [e,[]] #=> [["September", []]] 

e = "19" 
e[0][/[A-Z]/] #=> nil 
b.last.last << e 
b    #=> [["September", ["19"]]] 

e = "20" 
e[0][/[A-Z]/] #=> nil 
b.last.last << e 
b    #=> [["September", ["19", "20"]]] 

e = "25" 
e[0][/[A-Z]/] #=> nil 
b.last.last << e 
b    #=> [["September", ["19", "20", "25"]]] 

e = "26" 
e[0][/[A-Z]/] #=> nil 
b.last.last << e 
b    #=> [["September", ["19", "20", "25", "26"]]] 

e = "October" 
e[0][/[A-Z]/] #=> "O" 
b << [e,[]] #=> [["September", ["19", "20", "25", "26"]], ["October", []]] 

等等。

如果你想未来的日子是整数,变化:

b.last.last << e 

到:

b.last.last << e.to_i 
+0

感谢您提出写作问题的建议,尤其是让我一步一步通过你做了什么,卡里。我会尝试你的建议,并让你知道它是怎么回事。 – Gary7 2014-09-29 23:42:49

+0

哦,你问我想要的结果是什么。我想将每个字符串组合成日期,我可以使用Time.parse和strftime来处理日期。因此,对于“a”我最终想要结束于“2014年9月19日,2014年9月20日,2014年9月25日,2014年9月26日,2014年10月2日等等。然后,我将使用strftime来获取Day (例如,2014年9月20日星期六等) – Gary7 2014-09-29 23:48:26

+0

更新 - 在使用Cary提供的正则表达式工作了一段时间之后(谢谢!),我意识到当我运行时会丢弃字符串中的最后一个日期它在IRB。这里是我运行的代码和输出。谁能告诉我为什么发生这种情况? – Gary7 2014-12-21 18:12:46

相关问题