我不確定這是怎麼做到的,因爲我對正則表達式很陌生,並且似乎無法找到正確的方法來完成此操作,但是說我具有以下內容作爲字符串(包括所有制表符和換行符)Ruby將所有空格縮小爲單個空格
1/2 cup
onion
(chopped)
如何刪除所有空白並僅用一個空格替換每個實例?
我不確定這是怎麼做到的,因爲我對正則表達式很陌生,並且似乎無法找到正確的方法來完成此操作,但是說我具有以下內容作爲字符串(包括所有制表符和換行符)Ruby將所有空格縮小爲單個空格
1/2 cup
onion
(chopped)
如何刪除所有空白並僅用一個空格替換每個實例?
這是因爲你要正確對待全班的空白字符相同,用替換空白的任意組合的運行正則表達式做工精良,外殼單個空間字符。因此,如果該字符串存儲在s
,那麼你會怎麼做:
fixed_string = s.gsub(/\s+/, ' ')
你想擠法:
str.squeeze([other_str]*) → new_str
Builds a set of characters from the other_str parameter(s) using the procedure described for String#count. Returns a new string where runs of the same character that occur in this set are replaced by a single character. If no arguments are given, all runs of identical characters are replaced by a single character.
"yellow moon".squeeze #=> "yelow mon"
" now is the".squeeze(" ") #=> " now is the"
"putters shoot balls".squeeze("m-z") #=> "puters shot balls"
用最簡單的辦法gsub(/\s+/, ' ')
的問題是,它是非常緩慢的,因爲它取代了每一個空間,即使是單一的。但通常在單詞之間有1個空格,我們只有在有2個或更多個空格時才能修復。
更好的辦法是gsub(/[\r\n\t]/, ' ').gsub(/ {2,}/, ' ')
- 先幹掉特殊的空格,然後擠壓正常的空間
def method1(s) s.gsub!(/\s+/, ' '); s end
def method2(s) s.gsub!(/[\r\n\t]/, ' '); s.gsub!(/ {2,}/, ' '); s end
Benchmark.bm do |x|
n = 100_000
x.report('method1') { n.times { method1("Lorem ipsum\n\n dolor \t\t\tsit amet, consectetur\n \n\t\n adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.") } }
x.report('method2') { n.times { method2("Lorem ipsum\n\n dolor \t\t\tsit amet, consectetur\n \n\t\n adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.") } }
end;1
# user system total real
# method1 4.090000 0.010000 4.100000 ( 4.124844)
# method2 1.590000 0.010000 1.600000 ( 1.611443)
軌之內,你可以使用String#squish
,這是一個active_support
擴展。
require 'active_support'
s = <<-EOS
1/2 cup
onion
EOS
s.squish
# => 1/2 cup onion
這不太對,我想。它只會將選項卡的運行壓縮到單個選項卡中,並將換行符運行到單個換行符中。正如我讀到的,問題在於尋求一種方法來將空白字符與單個空格字符的組合運行替換掉。 – Chuck 2011-01-11 20:09:53
太糟糕了`String.squeeze`不接受regex作爲參數。 Upvote,如果你認爲這將是一個好主意;我可以提交公關。 – the911s 2015-05-14 21:27:17
這也刪除重複,例如。 「class」變成了「clas」,如果在html上運行它,這可能是一個破壞行爲。更合適的方法(如果在rails中)將是String#squish – engineerDave 2016-03-11 22:58:25