2012-03-05 37 views
1

試圖創建一個簡單的正則表達式可以提取的數量之間(7 - 14)開始與克字母和一些ID,像以下關鍵字後:在紅寶石和正則表達式匹配這麼多的結果

(g)(\d{1,6})\s+(\d{7,14}\s*)+ 

讓我們假設:

m = (/(g)(\d{1,6})\s+(\d{7,14}\s*)+/i.match("g12 327638474 83873478 2387327683 44 437643673476")) 

我的結果:

#<MatchData "g23333 327638474 83873478 2387327683 " "g" "12" "2387327683 "> 

但我需要爲最終的結果,包括:327638474,83873478,2387327683和排除44

現在我剛開最後一個號碼2387327683與這裏不包括前面的數字

任何幫助。

歡呼

+1

是什麼讓你認爲正則表達式是一個很好的工具?我的描述並不完全清楚。你可以給出更多的例子,說明什麼是有效的輸入,以及期望的輸出? – 2012-03-05 16:09:27

+0

當然,如果你有任何想法請求分享它,至於我我需要一些有效的輸入形式:G {ID} Num1 Num2 ...數字應該在7-14之間,所需的輸出Num1 Num2 ... 。 – Eqbal 2012-03-05 16:13:48

+0

你是否需要從一個更大的字符串中提取這些字符串,或者只需要從已經以'g'開頭的字符串中提取信息? – 2012-03-05 16:16:53

回答

0

正如一個供參考,在這裏是顯示完成所選答案的快一點辦法的基準:

require 'ap' 
require 'benchmark' 

n = 100_000 

s = "g12 327638474 83873478 2387327683 44 437643673476" 

ap s.split[1..-1].select { |x| (7..14).include? x.size }.map(&:to_i) 
ap s.split[1..-1].select { |x| 7 <= x.size && x.size <= 14 }.map(&:to_i) 

Benchmark.bm(11) do |b| 
    b.report('include?' ) { n.times{ s.split[1..-1].select { |x| (7..14).include? x.size }.map(&:to_i)  } } 
    b.report('conditional') { n.times{ s.split[1..-1].select { |x| 7 <= x.size && x.size <= 14 }.map(&:to_i) } } 
end 

ruby ~/Desktop/test.rb 
[ 
    [0] 327638474, 
    [1] 83873478, 
    [2] 2387327683, 
    [3] 437643673476 
] 
[ 
    [0] 327638474, 
    [1] 83873478, 
    [2] 2387327683, 
    [3] 437643673476 
] 
       user  system  total  real 
include?  1.010000 0.000000 1.010000 ( 1.011725) 
conditional 0.830000 0.000000 0.830000 ( 0.825746) 

對於速度我會使用條件測試。這有點冗長,但仍然很容易閱讀。

+0

這是Python領先於Ruby的一個方面:'7 <= len(x)<= 14'。 – 2012-03-07 00:45:38

2

而不是一個正則表達式,你可以使用類似的東西:

s = "g12 327638474 83873478 2387327683 44 437643673476" 
s.split[1..-1].select { |x| (7..14).include?(x.size) }.map(&:to_i) 
# => [327638474, 83873478, 2387327683, 437643673476] 
+0

感謝您的幫助在這裏,無論如何,讓我們說s =「G23333 11111111 2222222 3333333 44 555555555」,我會得到結果沒有555555555,因爲你可以看到我想包括7-14 – Eqbal 2012-03-05 16:27:54

+0

@Eqbal之間的所有數字:哦,對不起,一定誤解了你的問題。這是純粹的正則表達式無法實現的,所以我刪除了正則表達式解決方案並更新了更一般(更好)的純Ruby解決方案。 – 2012-03-05 16:30:15