2012-02-12 33 views
6

Si quisiera eliminar cosas como:.!. , ' "^ - # desde una matriz de cadenas, ¿cómo iba a ir sobre esto al tiempo que conserva todos los caracteres alfabéticos y numéricosEliminar todos los caracteres no alfabéticos, no numéricos de una cadena?

caracteres alfabéticos animales deben también incluir letras .. con signos diacríticos incluyendo a o C

+1

http://stackoverflow.com/questions/737475/how-i-can-delete-special-characters Esto responderá al 50% de su pregunta – Devjosh

+2

Normalmente hablamos de una Cadena que tiene caracteres y una Matriz que tiene datos diferentes, p.ej objetos, números o cadenas. ¿De verdad tienes un Array (quizás un conjunto de cuerdas?) O solo un String? – Phrogz

+0

-1. No tanto por no tratar de resolverlo, sino porque la pregunta no tiene sentido por la razón dada por Phrogz. –

Respuesta

17

se debe utilizar una expresión regular con la propiedad de carácter correcto En este caso, se pueden invertir la clase Alnum (caracteres alfabéticos y numéricos):

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

Para más compleja casos, digamos que querías También puntuacion, también se puede construir un conjunto de caracteres aceptables como:

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

Para todas las propiedades de caracteres, puede hacer referencia a la doc.

+0

Tenga en cuenta que está respondiendo a cómo gsub en una cadena, pero el título y la descripción utilizan la palabra "matriz". – Phrogz

+1

@Phrogz: De hecho. Con suerte, el OP sabe cómo hacer un 'mapa'. –

+1

+1 para mostrar los conjuntos Unicode adecuados. – Phrogz

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

Puede considerar una expresión regular.

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

Estoy asumiendo que usted está utilizando el rubí ya ha etiquetado que en su puesto. Podrías ir a través de la matriz, pasarla por una prueba usando una expresión regular y, si pasa, eliminarla/mantenerla en función de la expresión regular que uses.

una expresión regular puede utilizar podría ser algo como esto:

[^.!,^-#] 

que le dirá si su no uno de los caracteres dentro de los corchetes. Sin embargo, le sugiero que busque expresiones regulares, es posible que encuentre una mejor solución una vez que conozca su sintaxis y uso.

3

El siguiente trabajo para un array:

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

me prestó Jeremy sugirió regex.

+0

Gracias Phrogz, lo extrañé totalmente. :) – kikuchiyo

1

Si realmente tiene una matriz (como lo indica) y es una matriz de cadenas (supongo), p.

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

entonces se puede imaginar que o quiere actualizar cada cadena de la matriz con un nuevo valor, o que desea una matriz modificada que sólo contiene ciertas cadenas.

En el primer caso (que quiere 'limpiar' cada cadena de la matriz) que podría hacer uno de los siguientes:

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

Si esta última (que desea seleccionar un subconjunto de las cuerdas que cada coincidencias los criterios de la celebración de ser alfanuméricos) se puede utilizar uno de estos:

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

En Rubí, las expresiones regulares de la forma /\A………\z/ requieren toda la cadena para que coincida, como \A anclajes de la expresión regular para el inicio de la cadena de una nd \z anclajes hasta el final.

Cuestiones relacionadas