使用Cary提供的Regex后(谢谢!),我意识到当我在IRB中运行时,它正在删除字符串中的最后一个日期。这是代码和输出。谁能告诉我为什么会这样,以及如何解决它?
require 'rubygems'
require 'nokogiri'
require 'open-uri'
str = "September 19, 20, 25, 26, October 2, 3, 4, 10, November 3, 12, 17"
dates=str.scan(/\D+(?:\d+,\s+)+/).map { |s| [ s[/[a-z]+/i], s.scan(/\d+/) ] }
p dates
输出如下。如您所见,11月仅返回2个日期,但字符串中有3个。它在11月17日下降。
[["September", ["19", "20", "25", "26"]], ["October", ["2", "3", "4", "10"]], ["November", ["3", "12"]]]
C:\ RailsInstaller \ Ruby1.9.3 \引入nokogiri> -
答案 0 :(得分:1)
这应该可以解决问题:
dates=str.scan(/\D+(?:\d+(?:,\s+|$))+/).map { |s| [ s[/[a-z]+/i], s.scan(/\d+/) ] }
答案 1 :(得分:1)
最后一个字符串不以, \s+
结尾。
您需要为字符串末尾创建一个案例:
str = "September 19, 20, 25, 26, October 2, 3, 4, 10, November 3, 12, 17"
dates=str.scan(/\D+(?:\d+(?:,\s+|$))+/).map { |s| [ s[/[a-z]+/i], s.scan(/\d+/) ] }
p dates
答案 2 :(得分:1)
制作正则表达式optional的,\s+
部分:(?:,\s+)?
。放在一起:
str.scan(/\D+(?:\d+(?:,\s+)?)+/) ...
它使用non-capturing group,因此不会干扰scan
方法的工作方式。