正则表达式删除字符串中的最后一个字符

时间:2014-12-21 19:16:46

标签: ruby regex

使用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> -

3 个答案:

答案 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方法的工作方式。