2014-12-21 121 views
0

使用Cary提供的正則表達式(謝謝!)後,我意識到當我在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

我修正了我的錯誤[原始答案](http://stackoverflow.com/questions/26086602/can-anyone-help-me-dry-this-regex/26087594#comment43610779_26087594),也改變了方法,我認爲更好。它現在是'str.scan(/ [A-Z] [a-z] + | \ d + /)。each_with_object([]){| e,b | e [0] [/ [A-Z] /]? b << [e,[]]:b.last.last << e}'。 –

回答

1

這也許應該解決的問題:

dates=str.scan(/\D+(?:\d+(?:,\s+|$))+/).map { |s| [ s[/[a-z]+/i], s.scan(/\d+/) ] } 
+0

謝謝大家。事實上,凱瑞Swoveland的答案完美,但我不知道如何接受評論。 – Gary7

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 
1

讓正則表達式optional,\s+部分:(?:,\s+)?。放在一起:

str.scan(/\D+(?:\d+(?:,\s+)?)+/) ... 

它採用了non-capturing group所以它不會與scan方法是如何工作的干擾。

相關問題