我真的不明白你在第一個循環中所做的很多事情。
您將每個由空格分隔的文本塊都映射到一個數組中的唯一值,該數組通過組合一組字母字符並將其插入數組中。
這對於你想要的東西來說太複雜了。試試這個:
goal = File.readlines('big.txt').select do |word|
word =~ /^[a-zA-Z]+$/ &&
word.length >= 5
end
這使得它也很容易添加新的條件。如果單詞不能包含「Q」或「Q」,例如:
goal = File.readlines('big.txt').select do |word|
word =~ /^[a-zA-Z]+$/ &&
word.length >= 5 &&
! word.upcase.include? 'Q'
end
這是假設在你的字典中的每個字是自己的路線。你可以回到在空白處分割它,但它讓我懷疑你正在閱讀的文件是否是可讀的文本; a.k.a,它具有以句號或逗號結尾的「單詞」,就像這句話一樣。在這種情況下,分割空白將不起作用。
另一個說明 - 地圖是錯誤的數組函數使用。它修改一個數組中的值並從這些值中創建另一個值。你想從數組中選擇某些值,但不能修改它們。 Array#select方法是你想要的。
另外,如果您期待非標準字母字符,隨意修改正則表達式使用:alpha:標記。
編輯:第二個版本
goal = /([a-z][a-z']{4,})/gi.match(File.readlines('big.txt').join(" "))[1..-1]
說明:加載一個文件,該文件與空間聯合起來的所有線路。捕獲一組字母的所有出現,至少有5個字母,可能包含,但不以'
開頭。把所有這些事件放到一個數組中。 [1 ..- 1]丟棄MatchData對象返回的「完全匹配」,這將被附加在一起的所有單詞。
這種運作良好,而且只有一條線路爲您的整個任務,但是,它會匹配
sugar'
在
I'd like some 'sugar', if you know what I mean
和上面一樣,如果你的字可以」 t包含q
或Q
,您可以將正則表達式更改爲
/[a-pr-z][a-pr-z']{4,})[ .'",]/i
並有一個想法 - 做另一個選擇goal
,刪除所有以'
結尾的條目。這克服了我的正則表達式的侷限性
而不是存儲所有內容,並刪除不應該在那裏,不要將它保存在第一位。這將是一個巨大的改進。 – SlySherZ 2014-11-20 17:43:21
我在下面回答,但我對你的風格有一個評論:你同時使用do..end(對於map)和{..}(對於每個)作爲傳遞塊的方式。一般情況下,除非塊是單行(如{| word | word.upcase!}),否則始終使用do..end – 2014-11-20 18:23:48
將正則表達式更改爲僅匹配大於5個字母的單詞,使代碼在測試用例中運行速度加快了35倍我這樣做......是的:D – SlySherZ 2014-11-20 18:25:11