2012-02-12 60 views
6

Nếu tôi muốn loại bỏ những thứ như:.!. , ' "^ - # từ một mảng các chuỗi, làm thế nào tôi sẽ đi về vấn đề này trong khi giữ lại tất cả các ký tự chữ cái và sốXóa tất cả các ký tự không phải chữ cái, không phải chữ số từ một chuỗi?

phép ký tự chữ cái cũng nên bao gồm chữ .. với dấu phụ trong đó có một hoặc ç

+1

http://stackoverflow.com/questions/737475/how-i-can-delete-special-characters điều này sẽ trả lời 50% câu hỏi của bạn – Devjosh

+2

Thông thường chúng ta nói về một Chuỗi có các ký tự và một mảng có dữ liệu khác nhau, ví dụ đối tượng, số hoặc chuỗi. Bạn có thực sự có một mảng (có lẽ là một mảng dây?) Hoặc chỉ là một String? – Phrogz

+0

-1. Không quá nhiều vì không cố gắng giải quyết nó, nhưng bởi vì câu hỏi là vô nghĩa vì lý do được đưa ra bởi Phrogz. –

Trả lời

17

bạn nên sử dụng một regex với tài sản ký tự chính xác Trong trường hợp này, bạn có thể đảo ngược lớp Alnum (ký tự chữ và số):

"◊¡ Marc-André !◊".gsub(/\p{^Alnum}/, '') # => "MarcAndré" 

Đối phức tạp hơn trường hợp, nói rằng bạn muốn cũng chấm câu, bạn cũng có thể xây dựng một tập hợp các ký tự có thể chấp nhận như:

"◊¡ Marc-André !◊".gsub(/[^\p{Alnum}\p{Punct}]/, '') # => "¡MarcAndré!" 

Đối với tất cả các thuộc tính nhân vật, bạn có thể tham khảo các doc.

+0

Lưu ý rằng bạn đang trả lời cách gsub trên một chuỗi, nhưng tiêu đề và mô tả sử dụng từ "mảng". – Phrogz

+1

@Phrogz: Thật vậy. Hy vọng rằng OP biết cách làm một 'map'. –

+1

+1 để hiển thị bộ Unicode phù hợp. – Phrogz

3
string.gsub(/[^[:alnum:]]/, "") 
1

Bạn có thể xem xét cụm từ thông dụng.

http://www.regular-expressions.info/ruby.html

Tôi giả định rằng bạn đang sử dụng ruby ​​kể từ khi bạn gắn thẻ đó trong bài viết của bạn. Bạn có thể đi qua các mảng, đặt nó thông qua một thử nghiệm bằng cách sử dụng một regexp, và nếu nó vượt qua loại bỏ/giữ nó dựa trên regexp bạn sử dụng.

Một regexp bạn có thể sử dụng có thể đi một cái gì đó như thế này:

[^.!,^-#] 

Điều đó sẽ cho bạn biết nếu nó không một trong những nhân vật bên trong dấu ngoặc đơn. Tuy nhiên, tôi khuyên bạn nên tra cứu các biểu thức chính quy, bạn có thể tìm thấy giải pháp tốt hơn khi bạn biết cú pháp và cách sử dụng của chúng.

3

Sau đây sẽ làm việc cho một array:

z = ['asfdå', 'b12398!', 'c98347'] 
z.each { |s| s.gsub! /[^[:alnum:]]/, '' } 
puts z.inspect 

tôi mượn của Jeremy đề nghị regex.

+0

Cảm ơn Phrogz, tôi hoàn toàn bỏ lỡ điều đó. :) – kikuchiyo

1

Nếu bạn thực sự có một mảng (như bạn nêu) và đó là một chuỗi các chuỗi (tôi đoán), ví dụ:

foo = [ "hello", "42 cats!", "yöwza" ] 

thì tôi có thể tưởng tượng bạn muốn cập nhật từng chuỗi trong mảng với giá trị mới hoặc bạn muốn một mảng đã sửa đổi chỉ chứa các chuỗi nhất định.

Nếu trước đây (bạn muốn để 'làm sạch' mỗi chuỗi mảng) bạn có thể làm một trong các cách sau:

foo.each{ |s| s.gsub! /\p{^Alnum}/, '' }  # Change every string in place… 
bar = foo.map{ |s| s.gsub /\p{^Alnum}/, '' } # …or make an array of new strings 
#=> [ "hello", "42cats", "yöwza" ] 

Nếu sau này (bạn muốn chọn một tập hợp con của chuỗi trong đó mỗi trận đấu tiêu chí của bạn giữ chữ cái và số), bạn có thể sử dụng một trong các:

# Select only those strings that contain ONLY alphanumerics 
bar = foo.select{ |s| s =~ /\A\p{Alnum}+\z/ } 
#=> [ "hello", "yöwza" ] 

# Shorthand method for the same thing 
bar = foo.grep /\A\p{Alnum}+\z/  
#=> [ "hello", "yöwza" ] 

trong Ruby, biểu thức thông thường có dạng /\A………\z/ đòi hỏi toàn bộ chuỗi để phù hợp, như \A neo biểu thức chính quy để bắt đầu của chuỗi một nd \z neo đến cùng.

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