2015-10-06 59 views
0

文件中有一行包含!。我需要所有其他線路。我只想在文件中打印不以感嘆號開頭的行。查看一行的開頭是否與正則表達式字符匹配

的代碼行,我已經寫了迄今:

unless parts.each_line.split("\n" =~ /^!/) 
    # other bit of nested code 
end 

但它不工作。我該怎麼做?

+0

歡迎來到Stack Overflow。我們需要一個最小的數據例子,檢查數據和您的預期輸出。請參閱「[問]」以獲取問題的預期信息。 –

回答

0

您可以使用string#start_with查找以特定字符串開頭的行。

file = File.open('file.txt').read 
file.each_line do |line| 
    unless line.start_with?('!') 
    print line 
    end 
end 

您還可以檢查的第一個字符的索引

unless line[0] === "!" 

您還可以使用正則表達式

unless line.scan(/^!/).length 
+0

不要使用'read'然後''each_line';它根本無法擴展。而是使用更快的'foreach'。 'start_with?'比等效的正則表達式快。使用'scan(/ ^!/).length'不是一個好的選擇,因爲這不是'scan'的用途。如果你想知道該行是否以'!開頭,那麼直接執行:'line [/ ^!/]'但記住,這比使用'start_with?'慢。 –

2

做到這一點作爲一個開始我會使用:

File.foreach('foo.txt') do |li| 
    next if li[0] == '!' 
    puts li 
end 

foreach速度極快並允許您的代碼處理任何大小的文件 - 「可擴展」是該術語。有關更多信息,請參閱「Why is "slurping" a file not a good practice?」。

li[0]是Ruby中常見的習慣用法,用於獲取字符串的第一個字符。再次,這是非常快,是我最喜歡的方式去那裏,但是考慮到這些測試:

require 'fruity' 

STR = '!' + ('a'..'z').to_a.join # => "!abcdefghijklmnopqrstuvwxyz" 

compare do 
    _slice { STR[0] == '!' } 
    _start_with { STR.start_with?('!') } 
    _regex { !!STR[/^!/] } 
end 

# >> Running each test 32768 times. Test will take about 2 seconds. 
# >> _start_with is faster than _slice by 2x ± 1.0 
# >> _slice is similar to _regex 

使用start_with?(或字符串結尾相當於end_with?)快一倍,它看起來像我將使用從現在起end_with?

foreach相結合,你的代碼將有一個快速和高效的好機會。

有關更多信息,請參閱「What is the fastest way to compare the start or end of a String with a sub-string using Ruby?」。

+0

'start_with'比'[]'快,因爲沒有臨時字符串被創建?如果li [0]!='!''或者放置li,除非li [0] =='!'''你不喜歡'放置li嗎?一個小問題:我建議'IO.foreach',因爲'foreach'在'IO'中定義(並由'File'繼承)。如果讀者想查找「foreach」的文檔,他們可能會在File的文檔中找不到時感到困惑。 –

+0

我不喜歡'放置li',因爲它是視覺噪音,所以我寧願'puts'是獨立的。是的,File不會繼承IO,但是很多OO代碼都是如此。由於我正在閱讀一個文件,我使用'File.foreach'。如果我從不同類型的流中進行選擇,我的選擇可能會有所不同。 –

相關問題