Podane struny:Identyfikacja spacje vs inny znak przebiega ciąg
strs = [
"foo",
" ",
"Hello \n there",
" Ooh, leading and trailing space! ",
]
Chcę prostą metodę identyfikujące wszystkie sąsiadujące serie białych i nie-białych znaków, aby wraz z czy prowadzony jest spacja czy nie:
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:" "},
#=> ]
To prawie działa, ale zawiera jedną grupę wiodącą {k:0, s:""}
gdy łańcuch nie zaczynają się od spacji:
def find_whitespace_runs(str)
str.split(/(\S+)/).map.with_index do |s,i|
{k:i%2, s:s}
end
end
Motywacja w świecie rzeczywistym: pisanie a syntax highlighter, która odróżnia odstępy od nie-białych znaków w kodzie odwzorowanym w inny sposób.
Z ciekawości, dlaczego 0/1 zamiast falsy/truthy? –
@WayneConrad Głównie dlatego, że sprawił, że wyniki trzeciego przykładu pasują do jednej linii :) Ponadto, jak widać w odnośniku z tego pytania, faktycznie nazywam 'each' i indeksuję do tablicy etykiet. – Phrogz