2011-11-23 44 views
0

我試圖用盡可能少的代碼來解決Ruby問題:)。我想檢查給定的字符串是否以不同數量的符號開始,可以說一到三個'a'。這很容易使用reg exp,我可以寫string.match(\^a {1,3}。* \)。但是,我必須根據a的確切數量對字符串進行更改。我怎樣才能檢測到它們,而不使用三個IF的那樣:在字符串的開頭找到給定符號的確切數字

do_string_manipulation1 if string.match(/^a.*/) 
do_string_manupulation2 if string.match(/^aa.*/) 
... 

感謝提前:)

回答

1

爲什麼不使用正則表達式第一個修改版本,然後簡單地算一個是它返回?一拉

m = string.match(/^(a{1,3})/) 
case m[1].size 
    when 1 
    when 2 
    when 3 
end 

當然,你也可以使用一個數組來存儲程序調用,取決於數量:

routines = [nil, method(:do_string_manipulation1), method(:do_string_manipulation2), ...] 
routines[m[1].size].call 
+0

非常感謝。我不知道'匹配'返回什麼 – mjekov

+0

MatchData對象,如下所述:http://rubydoc.info/stdlib/core/1.9.3/MatchData –

+0

或者,您可以使用=〜運算符,然後訪問全局變量$ 1(在這種情況下,通常它是$ 1 .. $ n)。這樣做的好處是速度更快,因爲它不必創建MatchData對象。 –

1

取決於你的字符串操作是什麼。

您可以通過執行確定連續一個的數量:

string.match(/^(a{1,3}).*/)[1].size 

您還沒有定義的規則,所以我的是:

"a" - downcase 
"aa" - reverse 
"aaa" - swapcase 

所以我的代碼是:

string.send([:downcase, :reverse, :swapcase][string.match(/^(a{1,3}).*/)[1].size-1]) 

如果你的規則更加複雜,那麼你可以將它們定義爲一個類的方法並根據這個方法調用它們電話號碼返回。

相關問題