2011-11-02 106 views
0
str1 = "M Rahim (C)(W): 61(97)S A Hasan: 51(68)" 
str2 = "R Taylor (C): 76(160)B Watling: 16(26)" 

puts format(str1) #=> "M Rahim (C)(W): 61(97)\nS A Hasan: 51(68)" 
puts format(str2) #=> "R Taylor (C): 76(160)\nB Watling: 16(26)" 

獲取這些輸出我需要在format()函數中做什麼。我沒有太多熟悉正則表達式紅寶石 - 正則表達式

回答

2

這可能做的伎倆,但它是很難知道有這樣一個有限的樣本:

def format(s) 
    s.sub(/\A(.*?:\s*\d+\(\d+\))/) { $1 + "\n" } 
end 

,以查找是': 61(97)'': 76(160)'或通常最主要的,一個冒號後跟零個或多個空白字符,後跟一個數字,後跟一個括號內的數字。

如果你不知道有多少項是在每一行,那麼你可以使用scan提取它們並join把他們重新走到一起:

def format(s) 
    s.scan(/.*?:\s*\d+\(\d+\)/).join("\n") 
end 

例如:

>> s = str1 + str2 
=> "M Rahim (C)(W): 61(97)S A Hasan: 51(68)R Taylor (C): 76(160)B Watling: 16(26)" 
>> s.scan(/.*?:\s*\d+\(\d+\)/).join("\n") 
=> "M Rahim (C)(W): 61(97)\nS A Hasan: 51(68)\nR Taylor (C): 76(160)\nB Watling: 16(26)" 
+1

+1我正在研究發現不在字符串末尾的'\(\ d + \)',但這個更清晰(假設每行只有兩個數據項)。 –

+0

@Ray:如果可能有多個「條目」被混合到一行中,我可能會嘗試使用'scan' /'join'方法(如我的更新)。 –

2

那麼這裏是一個方法,發現任何)後跟一個大寫字母,並在)後插入一個換行符:

def format(s) 
    s.gsub(/\)(?=[A-Z])/, ")\n") 
end 

/開始正則表達式。

\)匹配字符串中的任何右括號。斜槓是需要的,因爲)在正則表達式中有特殊含義,所以它需要被轉義。

(?=[A-Z])是一個肯定的lookahead斷言,主張括號後跟大寫字母。

第二個/結束正則表達式。

1
def format(string) 
    string.sub(/(\d\))/, '\1' + "\n") 
end 

p format("M Rahim (C)(W): 61(97)S A Hasan: 51(68)") #=> "M Rahim (C)(W): 61(97)\nS A Hasan: 51(68)" 
p format("R Taylor (C): 76(160)B Watling: 16(26)") #=> "R Taylor (C): 76(160)\nB Watling: 16(26)"