2012-02-12 16 views
6

Se volessi rimuovere le cose come:.!. , ' "^ - # da un array di stringhe, come potrei fare per questo, pur mantenendo tutti i caratteri alfabetici e numericiRimuovere tutti i caratteri non alfabetici, non numerici da una stringa?

ammessi caratteri alfabetici devono includere anche le lettere .. con segni diacritici, tra cui a o C

+1

http://stackoverflow.com/questions/737475/how-i-can-delete-special-characters risponderà al 50% della tua domanda – Devjosh

+2

Di solito parliamo di una stringa con caratteri e una matrice con dati diversi, per esempio oggetti, numeri o stringhe. Hai davvero una matrice (forse una serie di stringhe?) O solo una stringa? – Phrogz

+0

-1. Non tanto per non cercare di risolverlo, ma perché la domanda è priva di senso per la ragione data da Phrogz. –

risposta

17

si dovrebbe usare una regex con la proprietà carattere corretto In questo caso, è possibile invertire la classe Alnum (carattere alfabetici e numerici):

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

Per più complessa casi, dire che volevi anche la punteggiatura, si può anche costruire un insieme di caratteri accettabili come:

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

Per tutte le proprietà dei caratteri, è possibile fare riferimento al doc.

+0

Nota che stai rispondendo a come gsub su una stringa, ma il titolo e la descrizione usano la parola "array". – Phrogz

+1

@Phrogz: Infatti. Speriamo che l'OP sappia come fare una 'mappa'. –

+1

+1 per mostrare i set Unicode corretti. – Phrogz

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

Si potrebbe considerare un'espressione regolare.

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

sto supponendo che si sta utilizzando rubino dal momento che con tag nel tuo post. Si può passare attraverso l'array, sottoporlo a un test usando un espressione regolare, e se viene passato rimuovi/manti in base alla espressione regolare che usi.

Un'espressione regolare si potrebbe utilizzare potrebbe andare qualcosa come questo:

[^.!,^-#] 

Che vi dirà se non uno dei personaggi all'interno delle parentesi. Tuttavia, ti suggerisco di cercare le espressioni regolari, potresti trovare una soluzione migliore una volta che ne conosci la sintassi e l'utilizzo.

3

Di seguito vi lavorare per un array:

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

ho preso in prestito Jeremy suggerito regex.

+0

Grazie Phrogz, mi sono totalmente perso. :) – kikuchiyo

1

Se si dispone veramente di un array (come si afferma) ed è un array di stringhe (suppongo), ad es.

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

quindi posso immaginare che si sia da aggiornare ogni stringa nella matrice con un nuovo valore, o che si desidera una matrice modificato che contiene solo determinate stringhe.

Nel primo caso (che si desidera 'pulito' ogni corda l'array) si potrebbe fare uno dei seguenti modi:

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" ] 

In quest'ultimo caso (che si desidera selezionare un sottoinsieme delle stringhe dove ogni partite i tuoi criteri di tenuta solo caratteri alfanumerici) è possibile utilizzare uno di questi:

# 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" ] 

In Ruby, le espressioni regolari della forma /\A………\z/ richiedono l'intera stringa in modo che corrisponda, come \A ancore l'espressione regolare per l'inizio della stringa un nd \z ancore fino alla fine.

Problemi correlati