2014-09-08 11 views
5

Tôi đang tìm kiếm một thời gian ở đây và không tìm thấy những gì tôi cần. Tôi đang học Ruby (1.9) và đang cố gắng làm một cái gì đó cơ bản với một tập tin văn bản. Tôi đang cố gắng sử dụng RegEx để loại bỏ các chữ cái không và khoảng trắng ở đầu dòng, bỏ qua dấu cách giữa các thẻ (tôi đang cố gắng đếm các từ trong tệp, do đó khi tôi muốn khoảng cách giữa các từ còn lại).Loại bỏ các ký tự đặc biệt bằng Ruby, nhưng không phải là dấu cách

Ex:

555 r6ub6y i7s e7a0sy... w1o2w4. 

Để thay đổi để:

ruby is easy... wow. 

Những gì tôi đã cho đến nay bằng cách sử dụng dòng lệnh để kiểm tra ruby rubyfile.rb < test.txt:

$stdin.each do |line| 
    line.chomp!.downcase! 
    line.gsub!(/[^a-zA-Z]/, "") #this takes away my spaces! 
    puts line 
end 
+0

Lưu ý rằng 'chomp!' Sẽ trả lại 'nil' nếu không có thay đổi nào được thực hiện. Đó là hành vi hơi bất ngờ – JKillian

+0

@JKillian "bất ngờ" hoặc "không mong muốn" trong trường hợp này. Các phương thức bang (!) Cho các chuỗi thường trả về nil khi các thay đổi không được áp dụng. Bang ngụ ý một đột biến nguy hiểm hơn của nó giống như phương pháp được đặt tên đôi khi nó làm thay đổi người nhận hoặc theo cách nào đó tạo ra các kết quả khác với phương pháp phi bang. Tôi thấy nó như là! Có nghĩa là nguy hiểm mong đợi một cái gì đó khác nhau. – engineersmnky

+0

@engineersmnky Aye, tôi quen thuộc với các phương pháp bang, và bạn hoàn toàn chính xác mà nhiều cho chuỗi hành xử tương tự như 'chomp'. Cá nhân tôi chỉ thấy kỳ lạ là nói chung chúng không thể bị xâu chuỗi như các phiên bản thông thường ... – JKillian

Trả lời

9
[^a-zA-Z. ] 

thêm không gian là tốt.

+1

Ví dụ: 'text.each_line {| l | đặt l.downcase.gsub (/ [^ a-zA-Z] /, ''). strip} '. –

+1

Thực ra bạn không cần phần 'A-Z' vì bạn đã downcased nó. –

+1

@MarkThomas vừa sử dụng regex của OP. – vks

4

Kể từ bây giờ, bạn chỉ xác định việc xóa các số này sẽ hoạt động như một dòng.

"555 r6ub6y i7s e7a0sy... w1o2w4.".gsub(/\d/,'').strip 
#=>"ruby is easy... wow." 

Về cơ bản, hãy xóa tất cả các số và khoảng trắng đầu/cuối.

Ngay bây giờ regex của bạn cho biết xóa mọi thứ trừ chữ hoa và chữ thường. Không chắc chắn những gì các loại ký tự mà bạn muốn gỡ bỏ, nhưng một cái gì đó như thế này có thể làm việc cho bạn quá nếu bạn chỉ muốn chữ hoa/chữ thường chữ không gian và thời gian

"555 r6ub6y i7s e7a0sy... w1o2w4.".gsub(/[^a-zA-Z\s.]/,'').strip 
#=>"ruby is easy... wow." 

Ngoài ra khi bao gồm cả khoảng trống trong một regex tôi luôn luôn có xu hướng sử dụng \s thay vì một không gian ngụ ý như [ ] bởi vì tôi cảm thấy nó thêm vào khả năng đọc là [a-zA-Z ] có thể là lỗi đánh máy và không nên bao gồm dấu cách nhưng [a-zA-Z\s] là rất dứt khoát khi nói rằng tôi muốn không gian.

Muốn tìm hiểu thêm về Regex, hãy kiểm tra Rubular nó là bộ đánh giá biểu thức chính quy cho Ruby và tôi sử dụng nó mọi lúc. Điều duy nhất nó không thực sự thảo luận về riêng của nó là tham lam và tham lam nhóm chụp nhưng tôi có một cảm giác bạn không phải lo lắng về điều này ngay bây giờ.

Các vấn đề liên quan