文件中有一行包含!
。我需要所有其他線路。我只想在文件中打印不以感嘆號開頭的行。查看一行的開頭是否與正則表達式字符匹配
的代碼行,我已經寫了迄今:
unless parts.each_line.split("\n" =~ /^!/)
# other bit of nested code
end
但它不工作。我該怎麼做?
文件中有一行包含!
。我需要所有其他線路。我只想在文件中打印不以感嘆號開頭的行。查看一行的開頭是否與正則表達式字符匹配
的代碼行,我已經寫了迄今:
unless parts.each_line.split("\n" =~ /^!/)
# other bit of nested code
end
但它不工作。我該怎麼做?
您可以使用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
不要使用'read'然後''each_line';它根本無法擴展。而是使用更快的'foreach'。 'start_with?'比等效的正則表達式快。使用'scan(/ ^!/).length'不是一個好的選擇,因爲這不是'scan'的用途。如果你想知道該行是否以'!開頭,那麼直接執行:'line [/ ^!/]'但記住,這比使用'start_with?'慢。 –
做到這一點作爲一個開始我會使用:
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?」。
'start_with'比'[]'快,因爲沒有臨時字符串被創建?如果li [0]!='!''或者放置li,除非li [0] =='!'''你不喜歡'放置li嗎?一個小問題:我建議'IO.foreach',因爲'foreach'在'IO'中定義(並由'File'繼承)。如果讀者想查找「foreach」的文檔,他們可能會在File的文檔中找不到時感到困惑。 –
我不喜歡'放置li',因爲它是視覺噪音,所以我寧願'puts'是獨立的。是的,File不會繼承IO,但是很多OO代碼都是如此。由於我正在閱讀一個文件,我使用'File.foreach'。如果我從不同類型的流中進行選擇,我的選擇可能會有所不同。 –
歡迎來到Stack Overflow。我們需要一個最小的數據例子,檢查數據和您的預期輸出。請參閱「[問]」以獲取問題的預期信息。 –