2012-05-04 15 views
7

Aby policzyć liczbę spacji na początku i na końcu łańcucha s robię:Ruby: Jak policzyć liczbę spacji na początku i końcu łańcucha?

s.index(/[^ ]/)    # Number of spaces at the beginning of s 
s.reverse.index(/[^ ]/)  # Number of spaces at the end of s 

Takie podejście wymaga przypadek kiedy s krawędź zawiera spacje tylko były traktowane oddzielnie.

Czy istnieje lepszy (bardziej elegancki wydajny /) sposób to zrobić?

Odpowiedz

12

inną wersję, to musi być jak najkrótszy

s[/\A */].size 
s[/ *\z/].size 
+0

Lepsze '*' zamiast '+' w przypadkach jak „AA” lub pustych strunach. – steenslag

+0

dzięki za edycję Misha, jest rzeczywiście lepiej – peter

3

Można to zrobić na raz:

_, spaces_at_beginning, spaces_at_end = /^(*).*?(*)$/.match(s).to_a.map(&:length) 
nie

zdecydowanie bardziej eleganckie choć.

2

ja nie wiem, czy to jest bardziej wydajny, ale to działa tak samo.

s.count(' ') - s.lstrip.count(' ') 
s.count(' ') - s.rstrip.count(' ') 
0

To także łatwe do zrobienia:

beginning = s.length - s.lstrip.length 
ending = s.length - s.rstrip.length 
+0

Ten za pproach nie zadziała, jeśli 's' zawiera inne białe spacje, np. 's =" \ tx "' –

+0

'\ t' będzie liczony jako pojedyncza spacja. Jednak prawdopodobnie nie zrozumiałem, co miałeś na myśli; jak chcesz potraktować przypadek karty? –

+0

'\ t' powinno być traktowane jak każda inna postać. Pytanie dotyczy liczenia miejsc. –

1
s.split(s.strip).first.size 
s.split(s.strip).last.size 

można również zrobić

beginning_spaces_length , ending_spaces_length = s.split(s.strip).map(&:size) 
Powiązane problemy