2012-02-11 26 views

Trả lời

21

lstrip có vẻ là những gì bạn muốn (giả sử trailing khoảng trắng nên được giữ):

>> s = "\naaaa\nbbbb" #=> "\naaaa\nbbbb" 
>> s.lstrip #=> "aaaa\nbbbb" 

Từ các tài liệu:

Trả về một bản sao của str với hàng đầu thế giới khoảng trắng loại bỏ. Xem thêm Chuỗi # rstrip và Chuỗi # dải.

http://ruby-doc.org/core-1.9.3/String.html#method-i-lstrip

+0

xấu hổ với tôi :) ! – fl00r

1

Điều này sẽ phù hợp với bạn: s.strip.

11

strip sẽ loại bỏ tất cả các khoảng trắng trailing

s = "\naaaa\nbbbb" 
s.strip! 

ít hack để chomp khoảng trắng hàng đầu:

str = "\nmy string" 
chomped_str = str.reverse.chomp.reverse 
+1

Chỉ cần làm rõ, 'String # strip' và' String # strip! 'Loại bỏ cả khoảng trắng * và * trailing *. Đó là lý do tại sao nó hoạt động trong trường hợp này. – tadman

+0

yeap 'strip sẽ xóa tất cả các khoảng trắng ở cuối :) Nhưng tôi không biết liệu anh ấy có cần xóa CHỈ khoảng trắng hoặc tất cả chúng. Dù sao không có 'chomp' cho khoảng trắng hàng đầu – fl00r

+5

@ fl00r Nhưng có' lstrip' để chỉ dải trắng hàng đầu :-) Tôi đã đăng câu trả lời. –

2

Không chắc chắn nếu đó là cách tốt nhất nhưng bạn có thể thử:

s.reverse.chomp.reverse 

nếu bạn muốn rời khỏi dòng mới (nếu nó tồn tại).

+0

Lưu ý: nếu bạn chuyển đối số sang 'chomp', bạn cũng sẽ muốn đảo ngược điều đó:' s.reverse.chomp (x.reverse) .reverse' – 0xtobit

6
s.sub(/^[\n\r]*/, '') 

này loại bỏ dòng mới hàng đầu (kí tự xuống dòng và dòng nguồn cấp dữ liệu, như trong chomp), chứ không phải bất kỳ khoảng trắng.

+0

'\ A' cho" bắt đầu chuỗi "có lẽ sẽ phù hợp hơn'^'cho" đầu dòng ". Nhưng biểu thức trên vẫn hoạt động như được yêu cầu vì 'phụ' cùng với dấu hoa thị đảm bảo nó khớp với dòng đầu tiên. –

7

Vì vậy, chỉ cần một chút làm rõ, có ba cách mà bạn có thể đi về điều này: sub, reverse.chomp.reverselstrip.

Tôi khuyên bạn nên chống lại sub vì nó ít có thể đọc được hơn, nhưng cũng vì cách hoạt động: bằng cách tạo chuỗi mới kế thừa từ chuỗi cũ của bạn. Thêm vào đó bạn cần một biểu thức chính quy cho một thứ khá đơn giản.

Vì vậy, bạn sẽ đến số reverse.chomp.reverselstrip. Nhiều khả năng, bạn muốn lstrip vì nó nhanh hơn một chút, nhưng hãy nhớ rằng các hoạt động stripkhông phải giống như hoạt động chomp. strip sẽ loại bỏ tất cả newlines hàng đầu khoảng trắng:

"\n aaa\nbbb".reverse.chomp.reverse # => " aaa\nbbb" 
"\n aaa\nbbb".lstrip     # => "aaa\nbbb" 

Nếu bạn muốn chắc chắn rằng bạn chỉ loại bỏ một ký tự và nó chắc chắn là một dòng mới, sử dụng các giải pháp reverse.chomp.reverse. Nếu bạn xem xét tất cả các dòng mới và khoảng trắng, hãy truy cập lstrip.

Một trường hợp tôi có thể nghĩ đến khi sử dụng cụm từ thông dụng sẽ là nếu bạn chưa biết số \r s và \n s lúc đầu và muốn cắt tất cả nhưng tránh chạm vào bất kỳ khoảng trắng nào. Bạn có thể sử dụng một vòng lặp và các phương thức String để cắt tỉa nhưng nó sẽ trở nên xấu hơn. Các tác động hiệu suất không thực sự quan trọng đến mức nào.

+0

Tôi muốn nói nếu anh ta chỉ muốn xóa một ký tự là một dòng mới, giải pháp hiện tại của anh ta với 'phụ!' (Phiên bản tại chỗ) tốt hơn rất nhiều so với 'reverse.chomp.reverse'. –

0

Một cách để làm điều này cho khoảng trắng hoặc ký tự không phải khoảng trắng là như thế này:

s = "\naaaa\nbbbb" 
s.slice!("\n") # returns "\n" but s also has the first newline removed. 
puts s # shows s has the first newline removed 
Các vấn đề liên quan