2013-06-05 67 views
5

鑑於字符串:識別空白VS其它字符在字符串運行

strs = [ 
    "foo", 
    " ", 
    "Hello \n there", 
    " Ooh, leading and trailing space! ", 
] 

我想要一個簡單的方法識別的空白和非空白字符所有連續運行,以便與運行是否是空白沿或不:

strs.each{ |str| p find_whitespace_runs(str) } 
#=> [ {k:1, s:"foo"} ], 
#=> [ {k:0, s:" "} ], 
#=> [ {k:1, s:"Hello"}, {k:0, s:" \n "}, {k:1, s:"World"} ], 
#=> [ 
#=> {k:0, s:" "}, 
#=> {k:1, s:"Ooh,"}, 
#=> {k:0, s:" "}, 
#=> {k:1, s:"leading"}, 
#=> {k:0, s:" "}, 
#=> {k:1, s:"and"}, 
#=> {k:0, s:" "}, 
#=> {k:1, s:"trailing"}, 
#=> {k:0, s:" "}, 
#=> {k:1, s:"space!"}, 
#=> {k:0, s:" "}, 
#=> ] 

這幾乎工作,但包括一個單一的領導{k:0, s:""}組每當字符串不以空白開始:

def find_whitespace_runs(str) 
    str.split(/(\S+)/).map.with_index do |s,i| 
    {k:i%2, s:s} 
    end 
end 

真實世界的動機:編寫a syntax highlighter區分空白和其他非空白代碼中的空白。

+2

出於好奇,爲什麼0/1而不是falsy/truthy? –

+0

@WayneConrad主要是因爲它使第三個例子的結果適合於一行:)另外,從問題的鏈接中可以看出,實際上我調用'each'並將其編入索引到一個標籤數組中。 – Phrogz

回答

5
def find_whitespace_runs(str) 
    str.scan(/((\s+)|(\S+))/).map { |full, ws, nws| 
    { :k => nws ? 1 : 0, :s => full } 
    } 
end 
+0

整蠱!我想在提交之前測試一下,但我認爲你贏得了金星。 – Phrogz

+0

是的,這是正確的,就像我目前的基於分裂的破解一樣快。 (並且在內存方面可能會稍微好一點。)好的工作。 – Phrogz

+0

Perfect,perfetto,parfait,perfekt,perfecto,完ぺき,完美,완전한! –

0

這個工程,但我不喜歡unless empty?(和compact)的存在。

def find_whitespace_runs(str) 
    str.split(/(\S+)/).map.with_index do |s,i| 
    {k:i%2, s:s} unless s.empty? 
    end.compact 
end 

我會很高興給予好評,產生正確的結果的任何答案,並會接受任何的答案是更優雅或明顯地更爲有效。