2012-05-04 36 views
7

Để đếm số lượng các khoảng trắng ở đầu và kết thúc của chuỗi s tôi làm:Ruby: Cách đếm số lượng dấu cách ở đầu và cuối chuỗi?

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

Cách tiếp cận này đòi hỏi các trường hợp cạnh khi s chứa dấu cách duy nhất để được xử lý riêng biệt.

Có phương pháp nào tốt hơn (thanh lịch/hiệu quả hơn) để làm như vậy không?

Trả lời

12

phiên bản khác, điều này có phải là ngắn nhất có thể

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

Tốt hơn '*' thay vì '+' cho các trường hợp như "aa" hoặc chuỗi rỗng. – steenslag

+0

cảm ơn Misha đã chỉnh sửa, thực sự tốt hơn – peter

3

Bạn có thể làm điều đó cùng một lúc:

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

Chắc chắn không thanh lịch hơn mặc dù.

2

Tôi không biết liệu nó có hiệu quả hơn hay không, nhưng cũng hoạt động tốt.

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

Nó cũng dễ dàng để làm:

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

này một pproach sẽ không hoạt động nếu 's' chứa các khoảng trắng khác, ví dụ: 's =" \ tx "' –

+0

'\ t' sẽ được tính là một dấu cách. Tuy nhiên, có lẽ tôi đã không hiểu ý bạn là gì; bạn muốn xử lý trường hợp tab như thế nào? –

+0

'\ t' phải được coi là bất kỳ ký tự nào khác. Câu hỏi đặt ra là đếm không gian. –

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

bạn cũng có thể làm

beginning_spaces_length , ending_spaces_length = s.split(s.strip).map(&:size) 
Các vấn đề liên quan